それが並行マークアンドスイープガベージコレクタであるとしましょう。
そのような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がA
2回目に実行されたときに何も削除されることを妨げるものはありません...
私が読んだオンザフライのマークアンドスイープガベージコレクターの説明では、置き換えられたオブジェクトは「グレー表示」である必要があると述べています。しかし、詳細はありません。ソリューションのより詳細な説明へのリンクをいただければ幸いです。