7

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

如果 x 和 y 是同一线程的操作,并且 x 在程序顺序中位于 y 之前,则 x 发生在 y 之前。

还有这个

原代码
Thread 1
r2 = A;
B = 1;

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

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

4

1 回答 1

13

JLS 的第 17.4.5 节特别指出了这一点:

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

如果有帮助,请在规范中将“happens-before”替换为“wurfles”,这样您对它的含义的直觉就不会发挥作用。您期望规范中不存在的保证-我怀疑是由于命名。

于 2012-05-03T21:27:37.787 回答