Java 在存在易失性变量的情况下是否会发生重新排序?

Java 在存在易失性变量的情况下是否会发生重新排序?,java,volatile,Java,Volatile,我做的如下,我的程序中只有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内存模型,根据我在Thread2中的理解,Reada总是给我1 我想知道我的理解是否正确 特别是,是否仍然可以进行重新排序,以便在第二

我做的如下,我的程序中只有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内存模型,根据我在Thread2中的理解,Reada总是给我1

我想知道我的理解是否正确


特别是,是否仍然可以进行重新排序,以便在第二个线程中看到A=0

你的假设基本上是正确的。不过,我会稍微重申一下,以符合JMM的保证


如果线程2读取
b
并看到值1,则
a
的后续读取将为1。正如您所说,如果线程2总是在“线程1”完成写入后读取
b
,那么线程2将看到值1,
a
的读取将如您所期望的那样。

我仍然不理解为什么线程1中不能发生重新排序。为什么a不能是0?哦,唉,我只是不明白,你能,请,让我参考JLS规范吗?它是这么说的?@Alex-链接问题的答案参考了JLS。基本上,您不能在易失性写入之后将任何写入移动到,也不能在易失性读取之前将任何读取移动到。