在下面的代碼片段中,在之後返回非空值是否在技術上有可能對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