2016-07-26 78 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实例就无法回收。