2011-10-20 50 views
6

我通過下面的帖子在Java回事弱引用沒有強引用: -WeakReference的不返回null,雖然有實際的參考對象

Understanding Weak References.

通過後去理論部分,試圖對空條件的弱參考進行測試。但是,對於弱引用空檢查從未返回下面的代碼真: -

package com.weak; 

import java.lang.ref.WeakReference; 

class Widget{} 

public class WeakReferenceDemo { 

    public static void main(String[] args) throws InterruptedException { 

     Widget widget = new Widget() ; 
     WeakReference<Widget> valueWrapper = new WeakReference<Widget>(widget) ; 

     System.out.println(valueWrapper.get()); 

     //here strong reference to object is lost 
     widget = null ; 

     int count = 0 ; 

     //here checking for null condition 
     while(valueWrapper.get() != null){ 
      System.out.print("."); 
      Thread.sleep(432) ; 

      if(++count % 25 == 0) System.out.println(); 
     } 

     System.out.println(valueWrapper.get()); 
    } 
} 

請建議,爲什麼valueWrapper.get()沒有返回null,雖然構件引用賦值爲null值。

謝謝。

+4

GC不是引用計數,當您將該引用歸爲空時,GC甚至不知道它 - 它會在下一個GC週期中找到它。 – harold

+0

@harold:upvoting。 – mogli

回答

11

與其等待垃圾收集,請嘗試用Runtime.getRuntime().gc()自己調用它,然後檢查null的弱引用。

當GC運行時,只能回收弱可達物體。由於你的程序沒有在堆上實例化更多的對象,所以這可能永遠不會發生,而無需手動要求它運行。

+0

現在,我明白了。謝謝。 – mogli

2

WeakReference.get()不返回null,直到垃圾收集器已經開始確定該對象只能弱到達爲止。這可能需要一些時間。

相關問題