7

私はJava仕様でこれを見ています:

x と y が同じスレッドのアクションであり、プログラムの順序で x が y の前にある場合、x は y の前に発生します。

そしてこれも

元のコード
スレッド 1
r2 = A;
B = 1;

有効なコンパイラ変換 (コンパイラは、どちらのスレッドでも命令を並べ替えることができますが、これがそのスレッドの実行に単独で影響を与えない場合)
スレッド 1
B = 1;
r2 = A;

私はその2つのことで混乱しています。
アクション x がアクション y の前に来る場合、x は y の前に発生するはずです。x の場合は r2=A、y の場合は B=1 と考えると、r2=A は B=1 の前に発生するはずです。y が true になる前に x が発生した場合、r2=A の前に B=1 が実行されるのはなぜですか?

4

1 に答える 1

13

JLS のセクション 17.4.5は、具体的にこれを示しています。

2 つのアクション間に事前発生関係が存在するからといって、必ずしも実装でその順序で実行する必要があるとは限らないことに注意してください。並べ替えが合法的な実行と一致する結果をもたらす場合、それは違法ではありません。

それが役立つ場合は、仕様のどこでも「前に起こる」を「ワーフル」に置き換えて、それが何を意味するかについての直感が働かないようにしてください。あなたは仕様にない保証を期待しています - 命名のために、私は疑っています。

于 2012-05-03T21:27:37.787 に答える