可以通过WeakReference检索弱可达对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了可以通过WeakReference检索弱可达对象相关的知识,希望对你有一定的参考价值。

我知道WeakReference是什么,我读了它的文档和许多博客和SO线程。但是,我仍然不清楚以下流程是否真的会发生。

  1. 对象X被引用强引用strRef和弱引用weakRef
  2. strRef正在随机线程中被清除
  3. weakRef正在随机线程上被取消引用
  4. 在上一步中检索的引用被分配给strRef

关于如何在GC上清除弱引用有很多讨论,但据我所知,GC在每次引用许可后都不会发生。因此,如果在步骤#2-#3之间没有发生GC,则看起来像上面的步骤#3可能会“复活”弱可达对象。

这种竞争条件非常不方便甚至是危险的,因此我认为应该有一些阻止它的东西,但我想在这里完全确定。

那么,是否有规范确保弱引用的对象无法复活,是否有任何与多线程相关的警告?

答案

因此,如果在步骤#2-#3之间没有发生GC,则看起来像上面的步骤#3可能会“复活”弱可达对象。

正确,即使它运行的GC,也不是所有弱引用都必须清除,例如当运行次要集合时,不会清理终身空间中的对象。只有Full GC才能确保清除所有弱引用。

这种竞争条件非常不方便甚至是危险的,因此我认为应该有一些东西阻止它,

这是你必须在任何时候检查的东西,因为你不知道后台线程何时清除强引用。注意:清除强引用只是意味着将内存值设置为null

是否有一个规范,确保弱引用的对象不能复活,是否有任何与多线程相关的警告?

甚至丢弃的物体也可以通过在this方法中设置对finalise的引用来复活。我建议你不要依赖这种行为。引用设置不是消息传递源,也不是具有很多线程安全保证的操作。

我认为我可以依赖弱引用来将这些UI类订阅到事件总线,这样以后就不需要取消订阅它们了。

您可以但是您必须检查侦听器是否仍处于活动状态。仅仅因为你可以得到一个弱引用它并不意味着你不打算丢弃它。

以上是关于可以通过WeakReference检索弱可达对象的主要内容,如果未能解决你的问题,请参考以下文章

可达性分析强软弱虚引用gc的过程中对象是否能回收三色标记跨代引用

几句话总结CLR内存回收

CLR垃圾收集器

C# 中的弱引用 WeakReference

WeakReference(弱引用)

说说WeakReference弱引用