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

标签 java android weak-references

考虑下一个 fragment :

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 时,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,只要您仍然持有对它的引用。它只是可以收集的对象。

您可以发布您提到的代码示例吗?

关于java - WeakReference 对象是否也与引用对象一起被垃圾收集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29353246/

相关文章:

java - 在单独的开发环境中管理 JAR 依赖项

java - Getter 属性(没有属性和 setter)通过 ValueStack 访问

java - volley中的entry.softTtl和entry.ttl有什么区别?

objective-c - EXC_BAD_INSTRUCTION 当合成@property(弱)IBOutlet NSWindow *window

ios - MVVM - 使用闭包将 ViewModel 与数据源绑定(bind) : capture list needed?

java - 无法找到 XML 模式命名空间 (JMS) 的 Spring 命名空间处理程序

java - 在 Java 中使用相同的 jButton 向 MySQL 中插入和更新数据

android - 如何在 onItemClick 监听器中获取列表项文本?

android - 在 imageview 中设置位图时出现 NullPointerException

Android 处理程序更改 WeakReference