2017-06-05 29 views
0

在下面的代码片段中,在之后返回非空值是否在技术上有可能对Widget的最后一个强可及引用已经消失?WeakReference.get()在没有强引用后是否返回非null?

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意味着只有垃圾收集器运行时才会处理弱引用:

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

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

回答

2

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

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

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

换句话说,只要对象变得微弱可达,您是否可以依靠垃圾收集器立即处理所有弱/软/幻影引用?

是否有有关此问题的一些更明确的文件?

您引用的哪部分文档对于您的问题的目的您认为是不明确的? “在某个时间点”的措辞可以理解为“不保证立即采取行动”。

+2

实际上,对于软引用,情况正好相反:只要虚拟机认为仍有足够的可用内存用于其他对象,虚拟机就会尝试保持软引用对象的活动状态。所以混淆软弱的参考是一个坏主意。 – biziclop

相关问题