0

同期ブロック内のコードが「happensbefore」セマンティクスに準拠していることを読みました。これにより、同期ブロック内に書き込まれたすべての値が他のスレッドに連続して表示されるようになります。さらに、キャッシュは同期ブロックの終了時にのみフラッシュされることを読みました。同期されたブロックの終了でキャッシュのみがフラッシュされる場合、以下で説明するシナリオでは、上記の「発生前」のセマンティクスはどのように適用されますか?

スレッドAはオブジェクトCへの参照を持ち、Cで同期された同期コードのCのフィールドを変更します。スレッドBもオブジェクトCへの参照を取得しました。これで、同期コードが終了する前にスレッドAが一時停止されます。スレッドBはアクションにジャンプし、Cで同期せずに、コード内のオブジェクトCのフィールドにアクセスします。

これで、スレッドBはスレッドAによって行われた変更を確認できることが保証されますか?

4

2 に答える 2

3

ポイントは、スレッドBも同期ブロックを使用し、スレッドAと同じモニターで同期する必要があるということです。

スレッドBが同期を使用していない場合、変更が表示される場合と表示されない場合があります。

于 2010-10-17T07:30:19.750 に答える
0

既存の回答に加えて、happens-before(X、Y)は、YがXによる更新を確認することのみを保証し、他のスレッドがYの結果の前にXの結果を確認することを保証しないことに注意してください。

(実際、単一のスレッド内で連続するアクション間の関係の前に、同期ブロック内にいる必要はありません。JLSの17.4.5の最初の箇条書きを参照してください

于 2010-10-17T08:02:43.250 に答える