2017-06-05 62 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

相關問題