3

一部のリンクでは、同期ブロック内のコードの並べ替えが可能であることが示されていますが、他のサイトでは不可能であると伝えられています。同期が使用されている場合、コードの並べ替えに関して実際に何が起こるかを説明する例を教えてください。

4

2 に答える 2

4

ランタイムは、事前発生が尊重されている限り、操作を並べ替えることができます。仕様は次のように書いています

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

より具体的には、2 つのアクションが事前発生関係を共有している場合、それらが事前発生関係を共有していないコードに対して、必ずしもその順序で発生したように見える必要はありません。たとえば、別のスレッドの読み取りとデータ競合している 1 つのスレッドの書き込みは、それらの読み取りに対して順不同で発生するように見える場合があります。

特に、1 つのスレッドが次の場合:

synchronized (lock) {
    x = 1;
    y = 1;
}

そして別のこと:

if (y == 1) System.out.println(x);

これらのスレッド間には発生前の関係はなく、他のスレッドはy以前xに割り当てられたことを観察し、0 を出力する可能性があります。

于 2013-09-21T09:53:28.527 に答える