让我们下面的语句:独立指令可以通过Java编译器或JVM交换指令顺序吗?
int d0, d1;
int[] ds = {0, 0};
现在一个线程具有以下说明:
d0++;
d1++;
而另一个线程指令:
ds[1] = d1;
ds[0] = d0;
如果我们并行运行这些线程,显然有三种组合可以看作:{0,0},{1,1}和{1,0}。
现在最大的问题是:还可以有{0,1}吗?编译器/ JVM可以简单地交换指令,因为它认为它们不相关?如果是,那么这些行为的“规则”究竟是什么,是由编译器还是JVM决定?
通常优化被认为是安全的,如果它们的行为与串行(iow,一个线程)模型中未优化的代码相同。除非相关的语言结构对线程有明确的规定 –