2017-12-20 23 views
2

私はWeakReferenceが何であるかを知っており、そのドキュメントと多くのブログとSOスレッドを読んでいます。しかし、次の流れが実際に起こるかどうかは、私には依然として不明です。WeakReferenceを通じて弱く到達可能なオブジェクトを取得できるか

  1. 強い参照strRefと弱参照weakRef
  2. strRefで参照されるオブジェクトX
  3. weakRefがランダムスレッド
  4. 前のステップで取得した基準に逆参照されているランダムスレッド上でクリアされています割り当てられているstrRef

GCで弱い参照がどのようにクリアされているかについてのアイデアがありますが、私の知る限りでは、各リファレンスクリア後にGCは発生しません。したがって、ステップ#2〜#3の間にGCが起こらなかった場合、弱く到達可能なオブジェクトが上記のステップ#3によって潜在的に「復活」する可能性があるように見えます。

このような競合状態は非常に不便で危険ですので、それを防ぐ何かがあるはずですが、私はここで完全に確認したいと思います。

弱参照オブジェクトを復活できないようにする仕様がありますか?また、マルチスレッドに関連する警告はありますか?

+2

はい。 'WeakReference'や' SoftReference'を破棄すると、参照された 'Object'のGCが再び強い参照がなくなるまでそのGCが阻止されます。これは、実際には、PhamtomReferenceを参照できない理由です。これは "_race condition_"ではなく、 "_危険"ではありません。この仕組みが理解できない場合は、 "_inconvinient_"にすぎません。**これは** **動作しなければならない方法です。 –

+0

@BoristheSpider、私はそれを競合状態とみなし、私の現在の弱い加入者を持つpub-subに対処するのではなく、一般的ではありません。これにより、加入者は、強い参照がすべてクリアされた後でも、偽の通知をランダムに受信する(一見)ことになります。とにかく、あなたに感謝します。ドキュメンテーションやブログ記事の関連部分へのリンクはありますか? – Vasiliy

+0

私は理解できません、どうして生存性を判断する到達可能性に頼っていますか?どのフレームワークでもpub/subの周りに構築されていることがわかります。アクターは終了時に明示的にシャットダウンする必要があります。これにより、あらゆる種類の奇妙な動作が防止されます。 –

答えて

3

したがって、GCがステップ#2〜#3の間に起こらなかった場合、上記ステップ#3によって弱く到達可能なオブジェクトが潜在的に "復活"する可能性があるように見えます。それが実行されたGCは、すべての弱参照は、例えばクリアする必要がない場合でも

正しいです、マイナーコレクションが実行されると、テンポラリスペース内のオブジェクトはクリーンアップされません。フルGCのみがすべての弱い参照をクリアすることができます。

このような競合状態がそれはあなたがするとき見当がつかない与えられた任意の時点でのためにチェックしなければならない何か、それゆえ私はそれを妨げる何かがあるはずだと思い、非常に不便でさえ危険である

バックグラウンドスレッドは強力な参照をクリアします。注:強い参照をクリアするということは、メモリ値をnullに設定することだけです。

弱参照オブジェクトが復活できないことを保証する仕様はありますか?また、マルチスレッドに関する警告はありますか?

でも廃棄オブジェクトは、finalise方法でthisへの参照を設定することによって復活させることができます。この動作に頼らないことをお勧めします。参照設定は、メッセージングのソースでも、スレッドの安全性が保証されている操作でもありません。

これらのUIクラスをイベントバスにサブスクライブするために弱い参照に依存することができたので、後でそれらのサブスクライブを解除する必要はありません。

リスナーがまだアクティブかどうかを確認する必要があります。あなたが弱い参照を得ることができたからといって、あなたがそれを捨てるつもりはなかったというわけではありません。

関連する問題