java重新排序和内存模型

时间:2012-05-03 21:24:12

标签: java

我在java规范中看到了这一点:

如果x和y是同一个线程的动作,x在程序顺序中出现在y之前,则x发生在y之前。

还有这个

原始代码
线程1
r2 = A;
B = 1;

有效的编译器转换(允许编译器重新排序任一线程中的指令,当这不会影响该线程的执行时) 线程1
B = 1;
r2 = A;

我对这两件事感到困惑 如果动作x在动作y之前出现,那么x应该在y之前发生。如果我们认为对于y而言r2 = A而对于y则考虑B = 1,则r2 = A应该在B = 1之前发生。怎么会有任何重新排序,如果在y为真之前x发生,那么在r2 = A之前如何执行B = 1?

1 个答案:

答案 0 :(得分:13)

Section 17.4.5 JLS 具体带来了这个:

  

应该注意的是,两个动作之间存在的先发生关系并不一定意味着它们必须在实现中以该顺序发生。如果重新排序产生的结果与合法执行一致,则不是非法的。

如果有帮助,请在规范中的“wurfles”中替换“之前发生的事情”,以便您的直觉关于它的含义不起作用。你怀疑,由于命名,我希望保证不会出现在规范中。