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" 将在下一个循环中成为垃圾收集的候选对象。
考虑下一个片段:
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" 将在下一个循环中成为垃圾收集的候选对象。