让我们采用以下语句:
int d0, d1;
int[] ds = {0, 0};
现在一个线程有以下指令:
d0++;
d1++;
而另一个线程有这条指令:
ds[1] = d1;
ds[0] = d0;
如果我们并行运行这些线程,ds
显然有三种组合:{0, 0}、{1, 1} 和 {1, 0}。
现在最大的问题是:也可以有 {0, 1} 吗?编译器/JVM 是否可以因为认为它们不相关而简单地交换指令?如果是,这种行为的“规则”究竟是什么?它是由编译器还是 JVM 决定的?
最佳答案
是的,{0, 1}
也是可以的。 Java 内存模型不够强大,无法保证这种情况下的顺序。这甚至不需要指令重新排序——如果您在 x86 或 x86_64 以外的任何平台上运行该程序,无论如何都会发生这种情况。
这里要明确一点,实际的 CPU 硬件将对这些加载和存储进行重新排序,只是如果它是 x86 则不会。
关于java - Java 编译器或 JVM 可以交换独立指令的指令顺序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13440329/