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

时间:2017-12-20 09:23:28

标签: java multithreading garbage-collection weak-references

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

  1. 对象X被强引用strRef引用,弱引用weakRef
  2. strRef正在随机线程中清除
  3. weakRef在随机线程上被取消引用
  4. 将上一步骤中检索到的引用分配给strRef
  5. 关于如何在GC上清除弱引用有很多讨论,但据我所知,GC在每次引用许可后都不会发生。因此,它看起来像一个弱的可达对象可能会被复活"如果在步骤#2-#3之间没有发生GC,则通过上面的步骤#3。

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

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

1 个答案:

答案 0 :(得分:3)

  

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

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

  

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

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

  

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

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

  

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

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