JSR-133 FAQは次のように述べています。
しかし、同期には相互排除以上のものがあります。同期により、同期ブロックの前または最中のスレッドによるメモリ書き込みが、同じモニターで同期する他のスレッドに予測可能な方法で表示されるようになります。同期ブロックを終了した後、モニターを解放します。これにより、キャッシュがメイン メモリにフラッシュされ、このスレッドによって行われた書き込みが他のスレッドから見えるようになります。同期ブロックに入る前に、モニターを取得します。これにより、ローカル プロセッサのキャッシュが無効になり、変数がメイン メモリから再ロードされます。その後、以前のリリースで可視化されたすべての書き込みを確認できます。
また、最新の Sun VM では、非競合同期は低コストであるという記事を読んだことも覚えています。私はこの主張に少し混乱しています。次のようなコードを検討してください。
class Foo {
int x = 1;
int y = 1;
..
synchronized (aLock) {
x = x + 1;
}
}
x への更新には同期が必要ですが、ロックを取得すると y の値もキャッシュからクリアされますか? もしそれが本当なら、ロックストライピングのような技術は役に立たないかもしれないからです。あるいは、JVM はコードを確実に分析して、同じロックを使用して別の同期ブロックで y が変更されていないことを確認し、同期ブロックに入るときに y の値をキャッシュにダンプしないようにすることはできますか?