能否通过 WeakReference 检索弱可达对象

Can a weakly reachable Object be retrieved through WeakReference

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

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

有很多关于如何通过 GC 清除弱引用的讨论,但据我所知,每次引用清除后都不会发生 GC。因此,如果在步骤 #2-#3 之间没有发生 GC,那么上面的步骤 #3 看起来弱可达对象可能是 "resurrected"。

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

那么,有没有一个规范可以保证弱引用对象不能被复活,有没有与多线程相关的注意事项?

Therefore, it looks like a weakly reachable object could potentially be "resurrected" by the step #3 above if GC did not happen between steps #2-#3.

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

Such a race condition is very inconvenient and even dangerous, therefore I think that there should be something that prevents it,

鉴于您不知道后台线程何时清除强引用,因此您必须随时检查它。注意:清除强引用仅意味着将内存值设置为 null 仅此而已。

is there a specification that ensures that weakly referenced objects can't be resurrected, and are there any caveats related to multithreading?

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

I thought I could rely on weak references in order to subscribe these UI classes to an event bus, such that there will be no need to unsubscribe them later.

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