2015-03-30 35 views
1

考慮下面的代碼片段: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"); 
    } 
} 

這是必要的「如果」的句子也包含空檢查爲「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是多餘的。

回答

1

不,weakA本身不能是null只要你仍然持有對它的引用。這只是可能收集的對象。

你可以發表你提到的代碼的例子嗎?

+0

謝謝阿克塞爾,我只需要確認一些非常明顯的事情,但我必須確定我沒有錯過任何東西。 – mevqz 2015-03-30 18:29:57

+0

我編輯過這篇文章來引用我提到的例子 – mevqz 2015-03-30 18:32:15

0

既然你已經在你的方法foo()創建的WeakReference的對象:

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

這意味着沒有weakA的機會是零,除非在方法foo()在任何階段,你讓它空由你自己。 如果weakA中的所有對象在下一次垃圾回收循環期間都爲空,它們將被收集。在上面的例子中,對象「a」將成爲下一個週期垃圾收集的候選對象。