可以通过WeakReference检索弱可达对象
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了可以通过WeakReference检索弱可达对象相关的知识,希望对你有一定的参考价值。
我知道WeakReference
是什么,我读了它的文档和许多博客和SO线程。但是,我仍然不清楚以下流程是否真的会发生。
- 对象
X
被引用强引用strRef
和弱引用weakRef
strRef
正在随机线程中被清除weakRef
正在随机线程上被取消引用- 在上一步中检索的引用被分配给
strRef
关于如何在GC上清除弱引用有很多讨论,但据我所知,GC在每次引用许可后都不会发生。因此,如果在步骤#2-#3之间没有发生GC,则看起来像上面的步骤#3可能会“复活”弱可达对象。
这种竞争条件非常不方便甚至是危险的,因此我认为应该有一些阻止它的东西,但我想在这里完全确定。
那么,是否有规范确保弱引用的对象无法复活,是否有任何与多线程相关的警告?
因此,如果在步骤#2-#3之间没有发生GC,则看起来像上面的步骤#3可能会“复活”弱可达对象。
正确,即使它运行的GC,也不是所有弱引用都必须清除,例如当运行次要集合时,不会清理终身空间中的对象。只有Full GC才能确保清除所有弱引用。
这种竞争条件非常不方便甚至是危险的,因此我认为应该有一些东西阻止它,
这是你必须在任何时候检查的东西,因为你不知道后台线程何时清除强引用。注意:清除强引用只是意味着将内存值设置为null
。
是否有一个规范,确保弱引用的对象不能复活,是否有任何与多线程相关的警告?
甚至丢弃的物体也可以通过在this
方法中设置对finalise
的引用来复活。我建议你不要依赖这种行为。引用设置不是消息传递源,也不是具有很多线程安全保证的操作。
我认为我可以依赖弱引用来将这些UI类订阅到事件总线,这样以后就不需要取消订阅它们了。
您可以但是您必须检查侦听器是否仍处于活动状态。仅仅因为你可以得到一个弱引用它并不意味着你不打算丢弃它。
以上是关于可以通过WeakReference检索弱可达对象的主要内容,如果未能解决你的问题,请参考以下文章