2016-07-26 67 views
-5

說我有類爪哇多線程:從多個線程改變可變

public class OuterClass 
{ 
    public static WorkerClass worker; 
} 

在線程1

當執行doLongRunningOperation下面的命令被執行

Outerclass.worker.doLongRunningOperation(); 

,在線程2

Outerclass.worker = new WokerClass(); 

線程1中的doLongRunningOperation會發生什麼情況?

workerworker線程1引用的對象是垃圾回收,只有在doLongRunningOperation完成後才能被垃圾收集worker對象。

編輯:

我認爲它應該是GC'ed,因爲它不再引用。但doLongRunningOperation會發生什麼?它會突然終止嗎?

+0

你能澄清你認爲會發生什麼,爲什麼?有什麼理由爲什麼它應該被GC'ed,什麼原因它不應該? –

+0

@SotiriosDelimanolis我已在編輯中澄清它。 – q126y

+0

你提到_ doLongRunningOperation完成後_所以我對你的新問題感到困惑_它將被突然終止__查看GC根的概念。 –

回答

2

Java垃圾收集器(GC)從一組GC 開始回收非可追蹤對象。也就是說,如果對象A被對象B引用,並且對象B被對象C引用,並且對象C被引用,則對象A,B和C對垃圾收集器都是安全的。

那麼根源是什麼?我不知道完整的答案,但我知道根集包含每個運行線程中的每個局部變量和參數。

因此,如果線程1中的某些局部變量或參數仍然具有對原始WorkerClass實例的引用,那麼該實例將繼續存在。

原始WorkerClass實例只有在任何線程或任何可跟蹤對象中的任何字段未被本地或arg引用時纔會被回收。當發生這種情況時,再也不會影響你的程序,因爲你的程序將不再有任何手段來訪問該對象。


P.S.,「參數和當地人」包括隱藏變量是Java實現的一部分,它包括隱含變量如在每一個對象的方法的參考this。只要其中的任何方法調用(例如,doLongRunningOperation)仍處於活動狀態,您的原始WorkerClass實例就無法回收。