有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

“if”语句还必须包含“weakA”对象(WeakReference对象)的空检查吗?大概是这样的:

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

或者在这种情况下只是一个多余的检查?我问这个问题是因为我看过很多检查WeakReference是否为null的代码和教程,我不确定这是否是因为当保存的引用对象是GC'ed时VM会擦除WeakReference本身

提前谢谢

编辑:

您可以在本教程中看到此模式的空检查示例: http://安卓-developers.blogspot.com.ar/2010/07/multithreading-for-performance.html

但我也在Multithreading For Performance中找到了它。在本例中,它检查AsyncTask中的WeakReference是否为null。onPostExecute()方法,但它没有明确地为WeakReference对象赋值,因此我猜检查WeakReference本身是否为null是多余的


共 (2) 个答案

  1. # 1 楼答案

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

    你能举一个你提到的代码的例子吗

  2. # 2 楼答案

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

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

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