我有以下代码
class VolatileCount {
volatile int count;
Object lock = new Object();
public void increment() {
synchronized (lock) {
count = count + 1;
}
System.out.print(" " + count);
}
}
如果我increment()
从多个线程调用同一个对象,我会得到以下输出(在您的机器上可能会有所不同)
2 3 2 5 4 8 8 6 11 13 10 9 15 14 12 20 19
查看重复的数字,我认为happens-before似乎被破坏了,因为考虑到前三个数字(2 3 2),如果线程看到 3 ,则增量已经发生,并且由于变量是易失性的,因此它的值应该是 3 或更多但是在任何线程中不能为 2。
但是,这里的打印行似乎已经重新排序,重新排序该行是否正确?我在这里想念什么?我在 JDK 7 (Eclipse) 上运行