それが並行マークアンドスイープガベージコレクタであるとしましょう。
そのようなGCが定数ポインターを処理するとき、それはそれらを(ルートから開始して)ウォークスルーし、遭遇したすべてのデータブロックにマークを付けます。次に、マークされていないものをすべてスイープします。クライアントコードは、使用するデータブロックをルートとしてマークする必要があります。
しかし、変数をどうすればよいでしょうか。ここに状況があります:
Vオブジェクトへのポインタを格納する変数ですA。Thread 1読み取りVと中断。Thread 2変更しV、オブジェクトを指すようにしますB。- ガベージコレクターは、「マーク」フェーズを実行し、
A参照されなくなった遭遇した後、「スイープ」フェーズ中に割り当てを解除します。 Thread 1目覚めさせ、ルートとしてマークすることにより(ステップ2でA既に読み取った)使用を試みVます。そして、Aもう存在しないので失敗します。
それで、これをどのように処理するのですか?
Thread 2置換オブジェクトをマークすることができるA(同様のフラグが新たに割り当てられたオブジェクトのために使用される)特殊なDO-未削除フラグで。しかし、このフラグを削除する必要があるのはいつですか?もちろんそれThread 1は可能です。しかし、Thread 2についてThread 1は何も知らないため、これが行われるかどうかはわかりません。これはA解放されないことにつながる可能性があります。そして、GCがそのフラグを削除する場合、GCがA2回目に実行されたときに何も削除されることを妨げるものはありません...
私が読んだオンザフライのマークアンドスイープガベージコレクターの説明では、置き換えられたオブジェクトは「グレー表示」である必要があると述べています。しかし、詳細はありません。ソリューションのより詳細な説明へのリンクをいただければ幸いです。