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

标签 java compiler-construction jvm instructions

让我们采用以下语句:

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 Memory Model FAQ

关于java - Java 编译器或 JVM 可以交换独立指令的指令顺序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13440329/

相关文章:

java - 实现接口(interface)方法、方法调用和类型转换

java - "Could not create the Java virtual machine"是病毒引起的还是机器坏了?

适用于 Mac 的 Ruby 编译器?

c++ - 使用 g++、bison 和 flex 进行编译时,yyparse() 中未定义对 `yylex' 的引用

java - 无法启动 Eclipse - JVM 终止。退出代码=1

java - 最近有关 JVM 的书籍?

java - 将有状态bean注入(inject)无状态bean

java - 新 SSL 证书的 Java 错误的 1024 位 DH 参数

java - 在Spring Integration中处理异常时遇到麻烦

java - 如何在XSSF中获取背景单元格颜色