能否通过 WeakReference 检索弱可达对象
Can a weakly reachable Object be retrieved through WeakReference
我知道 WeakReference
是什么,我阅读了它的文档以及许多博客和 SO 线程。但是,我仍然不清楚下面的流程是否真的会发生。
- 对象
X
被强引用 strRef
和弱引用 weakRef
引用
strRef
正在随机线程上清除
weakRef
正在随机线程上取消引用
- 在上一步中检索到的引用已分配给
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.
可以,但必须检查侦听器是否仍然处于活动状态。仅仅因为您可以获得对它的弱引用并不意味着您不打算丢弃它。
我知道 WeakReference
是什么,我阅读了它的文档以及许多博客和 SO 线程。但是,我仍然不清楚下面的流程是否真的会发生。
- 对象
X
被强引用strRef
和弱引用weakRef
引用
strRef
正在随机线程上清除weakRef
正在随机线程上取消引用- 在上一步中检索到的引用已分配给
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.
可以,但必须检查侦听器是否仍然处于活动状态。仅仅因为您可以获得对它的弱引用并不意味着您不打算丢弃它。