WeakReference 对象是否也与引用对象一起被垃圾收集?

Is the WeakReference object also Garbage Collected along with the referenced object?

考虑下一个片段:

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"); 
    }
}

'if' 语句还必须包含对 '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 是多余的。

不,只要您仍然持有对它的引用,weakA 本身就不能是 null。只是可以收集的object

你能post你提到的代码的例子吗?

由于您在方法 foo() 中创建了一个 WeakReference 对象:

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

这意味着 weakA 不可能为空,除非在任何阶段在方法 foo() 中您自己将其设置为空。 如果 weakA 中的所有对象在下一个垃圾回收周期中为 null,则它们将被回收。在上面的示例中,对象 "a" 将在下一个循环中成为垃圾收集的候选对象。