Java で、2 つの異なるプロセッサ P1 と P2 で同時に実行されている 2 つのスレッド T1 と T2 があるとします。
最初に、スレッド T2obj
は、(たとえば) 開始メモリ位置 0x1000 に割り当てられたオブジェクトを処理します。これにより、P2 はそのメモリ位置の値を内部的にキャッシュします。次に、T2 はオブジェクトへの (唯一の) 参照を無効にし、ガベージ コレクトされます。
スレッド T1 は次に
Foo fooRef = new Foo();
fooRef.x = 10;
fooRef.x
この Foo のインスタンスは、上記の T2 によって解放されたメモリを再利用して割り当てられたためです。
次に、T1 は fooRef 参照をスレッド T2 に渡します (キューまたはその他の共有メモリ メカニズムを介して)。
T2 は、以前にキャッシュされた古い古い値を認識しますか、それとも新しい値 10 を認識しますか?
ハードウェアキャッシュの一貫性メカニズムがないとしましょう。Java 自体は、オブジェクトのメモリの割り当てを解除または割り当てるときに、すべてのプロセッサのキャッシュを確実にクリアしますか? (ハードウェア キャッシュ コヒーレンシ メカニズムが配置されていても、コヒーレンシの伝播は瞬時ではなく、Java 自体による他のコヒーレンシ対策が講じられていない場合、T2 は古い値を読み取る可能性があります)。