我正在学习多线程。
下面是小代码片段
@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/