我在 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 之前执行?