2011-10-20 49 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,直到垃圾收集器已经开始确定该对象只能弱到达为止。这可能需要一些时间。

相关问题