2012-03-09 18 views
1

は、C#を使用して次のシナリオを考える:.NETガベージコレクタ「競合状態」

Someclass lInstance = new SomeClass(); 
System.WeakReference lWInstance = new System.WeakReference(lInstance); 

lInstance = null; 

System.GC.Collect(); 
System.GC.SuppressFinalize(lWInstance.Target); 

SuppressFinalizeが実行されると、GCスレッドが工assのファイナライザコードの内側にすでにあることを想像してみてください。

問題は何が起こるかです。 GCスレッドがFinalizerに入ったら、何も効果がないと思います。

+0

あなたはそれを試して何が起こったのですか?私はときどきファイナライザが実行され、ときどき実行されないと思います。 – dtb

+0

System.GC.Collect()は何もする保証はありません。それは単にコレクションをスケジュールするかもしれない。私の推測では、ファイナライゼーションが開始されると、それはいくつかの余分なチェックがない限り停止されません。 – CodingBarfield

+0

なぜ気にしますか? 'SuppressFinalize'はパフォーマンスの最適化でなければなりません。 – CodesInChaos

答えて

1

ファイナライザlInstanceが実行されていた場合は、lWInstance.Targetがnullと予想されます。私。 WeakReferenceは、有効で未確定のターゲットへの参照のみを返します。

+0

+1。それは不可能な競争状態です。 SuppressFinalizeメソッドがターゲットを処理している場合、アクティブではない弱い参照が存在します。 – TomTom

+0

ファイナライザが参照を再公開しない限り、* trueとなります。 – Joshua