【发布时间】:2017-12-20 09:23:28
【问题描述】:
我知道WeakReference 是什么,我阅读了它的文档以及许多博客和 SO 线程。但是,我仍然不清楚以下流程是否真的会发生。
- 对象
X被强引用strRef和弱引用weakRef引用 -
strRef正在随机线程上清除 -
weakRef在随机线程上被取消引用 - 上一步检索到的引用分配给
strRef
关于如何在 GC 上清除弱引用有很多讨论,但据我所知,每次引用清除后都不会发生 GC。因此,如果在步骤 #2-#3 之间没有发生 GC,那么看起来弱可达对象可能会通过上面的步骤 #3 “复活”。
这样的竞态条件非常不方便,甚至很危险,因此我认为应该有一些东西可以阻止它,但我想在这里完全确定。
那么,是否有一个规范可以确保弱引用的对象不能复活,是否有任何与多线程相关的警告?
【问题讨论】:
-
是的。推迟
WeakReference或SoftReference将阻止引用的Object的GC,直到再次没有强引用为止。事实上,这正是PhamtomReference不能被尊重的原因。这不是“竞争条件”,也不是“危险”。如果您不了解它是如何工作的,那只会“不方便” - 这是它必须工作的方式。 -
@BoristheSpider,我认为它是一种竞争条件,并且仅在我目前处理具有弱订阅者的 pub-sub 的情况下才危险,而不是一般情况下。这可能会导致订阅者(看似)随机收到虚假通知,即使在对它们的所有强引用都被清除后也是如此。无论如何,感谢您的输入。您是否有任何指向文档或博客文章相关部分的链接?
-
我不明白,你为什么要依靠可达性来确定活跃度?您可以看到,在任何围绕 pub/sub 构建的框架中,演员应该在完成后显式关闭 - 这可以防止各种奇怪的行为。
-
我正在构建一个复杂而深层次的 UI 相关类(在 Android 中)。我想我可以依靠弱引用来将这些 UI 类订阅到事件总线,这样以后就不需要取消订阅它们了。毕竟可能不是一个好主意。
-
没错,在层次结构的每一层中,父级都告诉其子级他们当前是否可见。如果它被删除或添加到父级本身,它也会告诉它的子级。这个简单的 DAG 可以在很大程度上解决所有这些问题 - 它还允许循环检测和其他类似的功能。
标签: java multithreading garbage-collection weak-references