Java のメモリ モデルは、ルールを強制する「前に発生する」関係に基づいていますが、キャッシュの無効化に関して仮想マシンの実装を最適化することもできます。
たとえば、次の場合:
// thread A
private void method() {
//code before lock
synchronized (lockA) {
//code inside
}
}
// thread B
private void method2() {
//code before lock
synchronized (lockA) {
//code inside
}
}
// thread B
private void method3() {
//code before lock
synchronized (lockB) {
//code inside
}
}
スレッド A が呼び出され、スレッド B が内部でmethod()
取得を試みた場合、ロックを解放する前にスレッド A がすべての変数に対して行ったすべての変更をスレッド B が監視する必要があります。ロック」セクション。lockA
method2()
lockA
一方、method3()
別のロックを使用し、事前発生関係を強制しません。これにより、最適化の機会が生まれます。
私の質問は、仮想マシンがこれらの複雑なセマンティクスをどのように実装するかということです。キャッシュが不要な場合、キャッシュの完全なフラッシュを回避しますか?
どの変数がどの時点でどのスレッドによって変更されたかをどのように追跡して、必要なキャッシュラインだけをメモリからロードするのでしょうか?