在下面的代码片段中,在之后返回非空值是否在技术上有可能对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意味着只有垃圾收集器运行时才会处理弱引用:
假设垃圾收集器在某个时间点确定某个对象很弱可达。那时它会原子地清除对该对象的所有弱引用,以及通过一系列强和软引用可访问该对象的任何其他弱可访问对象的所有弱引用。
是否有一些关于此行为的更明确的文档?
实际上,对于软引用,情况正好相反:只要虚拟机认为仍有足够的可用内存用于其他对象,虚拟机就会尝试保持软引用对象的活动状态。所以混淆软弱的参考是一个坏主意。 – biziclop