WeakReference.get()在没有强引用后返回非null吗?

时间:2017-06-05 07:33:20

标签: java garbage-collection weak-references

在以下代码段中,widgetRef.get()技术上是否可能在最后一次强烈可达的Widget引用消失后返回非空值

private class Foo {
    private final WeakReference<Widget> widgetRef;

    public Foo(WeakReference<Widget> widgetRef) {
        this.widgetRef = widgetRef;
    }

    public bar() {
        final Widget widget = widgetRef.get();
        if (widget != null) {
            widget.stuff();
        }
    }
}

换句话说,一旦对象变得弱可达,你能否立即依赖垃圾收集器处理所有弱/软/幻像引用?

我相信你不能依赖垃圾收集器这样做,因为它可能随时运行(并且不会持续运行)。 WeakReference documentation表示仅在垃圾收集器运行时才处理弱引用:

  

假设垃圾收集器在某个时间点确定对象是弱可达的。那时它将原子地清除对该对象的所有弱引用以及对任何其他弱可达对象的所有弱引用,通过一系列强引用和软引用可以从该对象到达该对象。

是否有关于此行为的更明确的文档?

1 个答案:

答案 0 :(得分:2)

  

在下面的代码片段中,widgetRef技术上是否可能,get()在对Widget的最后一次强可达引用消失后返回非空值?

这不仅在技术上可行,而且很可能在实践中发生。您应该为对象实现某种生命周期,使其在结束时处于分离/关闭状态。如果它有一个所有者,那么该所有者应该对此负责。如果它有多个所有者,您可以使用计数器或所有者列表,主要是实现引用计数。

垃圾收集器仅用于管理内存,而不是其他资源或应用程序级生命周期。

  

换句话说,一旦对象变得弱可达,你能否立即依赖垃圾收集器处理所有弱/软/幻像引用?

没有

  

是否有关于此行为的更明确的文档?

您引用的文档的哪一部分对于您的问题的目的,您认为是否含糊不清?短语&#34;在某个时间点&#34;可以理解为&#34;不保证立即采取行动&#34;。