Java编译器或JVM可以交换指令顺序的独立指令吗?

Dan*_*yel 4 java compiler-construction jvm instructions

我们采取以下声明:

int d0, d1;
int[] ds = {0, 0};
Run Code Online (Sandbox Code Playgroud)

现在一个线程有以下说明:

d0++;
d1++;
Run Code Online (Sandbox Code Playgroud)

而另一个线程有这个指令:

ds[1] = d1;
ds[0] = d0;
Run Code Online (Sandbox Code Playgroud)

如果我们并行运行这些线程,显然有三种组合ds可能看起来像:{0,0},{1,1}和{1,0}.

现在最大的问题是:还能有{0,1}吗?编译器/ JVM是否可以简单地交换指令,因为它认为它们是无关的?如果是,那么这种行为的"规则"到底是由编译器还是JVM决定的?

Die*_*Epp 6

是的,{0, 1}也有可能.在这种情况下,Java内存模型不足以保证排序.这甚至不需要指令重新排序 - 如果你在x86或x86_64之外的任何东西上运行程序,这种情况无论如何都会发生.

在这里要清楚,实际的CPU硬件将重新排序这些加载和存储,而不是它是x86.

请参阅Java Memory Model FAQ