2015-03-30 29 views
1

考虑下面的代码片段:WeakReference对象是否也与引用的对象一起收集垃圾?

private void foo() { 
    A a = new A(); 
    WeakReference<A> weakA = new WeakReference<A>(a); 
    a = null; 

    while (true) { 
     if (weakA.get() != null) 
      System.out.println("weakA.get() != null !!!"); 
     else 
      System.out.println("weakA.get() == null"); 
    } 
} 

这是必要的“如果”的句子也包含空检查为“weakA”对象(WeakReference的对象)?类似这样的:

if (weakA != null && weakA.get() != null) 

或者这只是一个冗余检查在这种情况下?我这样问是因为我看过很多代码和教程,用于检查WeakReference是否为空,并且我不确定是否因为当保存的引用对象是GC时,VM删除WeakReference本身。

在此先感谢。

编辑:

你可以看到这个模式的例子本教程空校验: http://android-developers.blogspot.com.ar/2010/07/multithreading-for-performance.html

但我也发现它在Multithreading For Performance。在这种情况下,它会检查AsyncTask.onPostExecute()方法中的WeakReference是否为null,但它并未明确地向WeakReference对象赋值,所以我猜测WeakReference本身是否为null是多余的。

回答

1

不,weakA本身不能是null只要你仍然持有对它的引用。这只是可能收集的对象。

你可以发表你提到的代码的例子吗?

+0

谢谢阿克塞尔,我只需要确认一些非常明显的事情,但我必须确定我没有错过任何东西。 – mevqz 2015-03-30 18:29:57

+0

我编辑过这篇文章来引用我提到的例子 – mevqz 2015-03-30 18:32:15

0

既然你已经在你的方法foo()创建的WeakReference的对象:

WeakReference<A> weakA = new WeakReference<A>(a); 

这意味着没有weakA的机会是零,除非在方法foo()在任何阶段,你让它空由你自己。 如果weakA中的所有对象在下一次垃圾回收循环期间都为空,它们将被收集。在上面的例子中,对象“a”将成为下一个周期垃圾收集的候选对象。