java - 两个线程获得相同的值

标签 java multithreading

我正在学习多线程。

下面是小代码片段

@NotThreadSafe
public class UnsafeSequence {

    private int value;

    public int getNext() {

        return value++;

    }
}

我想知道,两个不同的线程何时以及如何获得相同的?有什么场景请分享一下吗?

最佳答案

UnsafeSequence seq = new UnsafeSequence();

new Thread(() -> System.out.println(seq.getNext())).start();
new Thread(() -> System.out.println(seq.getNext())).start();

很简单。这有可能打印相同的数字。为什么?

value++ 脱糖为 value = value + 1

假设线程 1 读取 value 为 0,然后将其加 1,但尚未将其分配回 value。同时,线程 2 读取值为 0 并加 1。现在,就像这样,我们有一个竞争条件,1 被打印了两次。

您可以使用AtomicInteger解决这个问题

public class Safe {

    private AtomicInteger value;

    public int getNext() {

        return value.getAndIncrement();

    }
}

现在,这是安全的,永远不会两次打印相同的数字

关于java - 两个线程获得相同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61357809/

相关文章:

java - 如何在 switch case 语句中匹配多个输入值?

multithreading - 多线程究竟是如何工作的?

java - 检查文件是否为有效的 jpg

java - 工厂模式和策略模式

java - Spring Security基本身份验证仅验证第一个请求

java - 带有 ResponseEntity 的 HttpStatus 和 pdf

c# - 使用来自 2 个不同线程的列表?

c# - ThreadPool.QueueUserWorkItem - 订单未保留?

Python 2.7 - Linux - 无限循环,放弃 CPU 给其他线程/进程

c++ - 将互斥锁绑定(bind)到对象