Java多线程:从多个线程更改变量

时间:2016-07-26 15:44:16

标签: java multithreading concurrency

说我上课

public class OuterClass
{
    public static WorkerClass worker;
}

在主题1中

执行以下命令

Outerclass.worker.doLongRunningOperation();
在执行doLongRunningOperation时,在线程2

中执行

Outerclass.worker = new WokerClass();

线程1中doLongRunningOperation会发生什么?

线程1引用的worker对象是否仅在doLongRunningOperation完成后才被垃圾收集,或者是否会突然终止到垃圾收集worker对象。

编辑:

我认为它应该是GC' ed,因为它不再被引用。但是doLongRunningOperation会发生什么?它会被突然终止吗?

1 个答案:

答案 0 :(得分:2)

Java垃圾收集器(GC)从一组GC 开始回收非可跟踪的对象。也就是说,如果对象A被对象B引用,对象B被对象C引用,而对象C被 root 引用,那么对象A,B和C都是安全的。垃圾收集器。

那根源是什么?我不知道完整的答案,但我知道根集包含每个正在运行的线程中的每个局部变量和参数。

因此,如果线程1中的某些局部变量或参数仍然具有对原始WorkerClass实例的引用,则该实例将继续存在。

原始的WorkerClass实例只有在任何线程中的任何本地或arg未被任何线程或任何可跟踪对象中的任何字段引用时才会被回收。当发生这种情况时,对您的程序来说无关紧要,因为您的程序将无法再访问该对象。

PS,“参数和本地”包括作为Java实现一部分的隐藏变量,它包含隐式变量,例如this引用每个对象方法。只要对其进行任何方法调用(例如,WorkerClass)仍处于活动状态,就无法回收原始doLongRunningOperation实例。