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是多余的
# 1 楼答案
不,
weakA
本身不能是null
,只要您仍然持有对它的引用。这只是可能被收集的物品你能举一个你提到的代码的例子吗
# 2 楼答案
由于在方法foo()中创建了WeakReference对象:
这意味着weakA不可能为null,除非在方法foo()的任何阶段,您自己将其设置为null。 如果weakA中的所有对象在下一个垃圾收集周期中为空,那么它们都将被收集。在上面的示例中,对象“a”将成为下一个周期垃圾收集的候选对象