【问题标题】:Java Multithreading : changing variable from multiple threadsJava多线程:从多个线程更改变量
【发布时间】:2016-11-30 08:52:40
【问题描述】:

说我有课

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 会发生什么?会突然终止吗?

【问题讨论】:

  • 您能否说明您认为会发生什么以及为什么?应该对它进行 GC 处理的一些原因是什么,不应该是哪些原因?
  • @SotiriosDelimanolis 我已经在编辑中澄清了。
  • 你提到在doLongRunningOperation完成之后所以我对你的新问题感到困惑它会被突然终止吗?看看这个概念GC 根。
  • @SotiriosDelimanolis 对不起,我的错,我已经澄清了那部分。英语不是我的母语。
  • 如果(并且同时)一个线程正在调用一个实例方法,它显然需要对该实例的引用。如果存在对实例的可访问引用,则无法对该实例进行垃圾回收。

标签: java multithreading concurrency


【解决方案1】:

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

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

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

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


PS,“arguments and locals”包括 hidden 变量,它们是 Java 实现的一部分,它包括 implicit 变量,例如每个对象中的 this 引用方法。只要对它的任何方法调用(例如,doLongRunningOperation)仍然处于活动状态,您的原始 WorkerClass 实例就无法回收。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-10
    • 2015-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多