我的做法如下,我的程序中只有 2 个线程。
// Thread 1
write a = 0
write a = 1
write volatile b = 1
// Thread 2
read volatile b // this I always do after write volatile b in the 1st thread
read a
我已经阅读了 Java 内存模型以及我在线程 2 中的理解 read a
总是给我 1。
我想知道我的理解是否正确。
特别是,重新排序是否仍然会发生,所以我在第二个线程中看到 a = 0?
最佳答案
您的假设大部分是正确的。不过,我会稍微重述一下,以符合 JMM 的保证。
如果线程 2 读取 b
并看到值 1,那么后续读取 a
将为 1。就像你说的,如果 Thread 2 总是在线程 1 完成写入之后读取 b
,然后线程 2 将看到值 1,并且 a
的读取将如您所期望的那样。
关于java - 在存在 volatile 变量的情况下可以发生重新排序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25548547/