java - 将成员作为参数传递给新线程时的局部变量引用和 GC

标签 java multithreading garbage-collection

我试图从根本上理解在以下情况下传递给线程的局部变量会发生什么。我需要在 someObject 上执行清理操作其中有 delete方法,该方法调用外部 API 通过其成员 id 删除 someObject 的实例。 .

public interface Deleteable {
    public delete() 
}

public SomeClass implements Deleteable {
    int id;
    public void delete() {
        HttpApiCall.deleteById(this.id);
    }
}

SomeClass someObject = null;
for(i = 0; i < 3; i++) {
// simple loop to illustrate problem
    someObject = new SomeClass();
    Runtime.getRuntime()
    .addShutdownHook(new Thread(someObject::delete));
}

当程序执行时,在线程能够调用delete之前,SomeClass的某些实例是否会被GC回收?每个线程是否会收到自己的新副本,或者是否会对 someObject 的最后设置值进行操作?

我读了一些关于 volatile 的内容。关键字,但我不确定它对我有帮助。

最佳答案

没有。您将这些 someObject::delete 方法引用添加到 Runtime 中的集合。由于运行时仍然可以访问,因此这些对象也可以访问并且不应该获得GCd。

关于java - 将成员作为参数传递给新线程时的局部变量引用和 GC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41940737/

相关文章:

java - 用JavaParser解析Java代码,找到父节点的语句类型

java - 为什么需要以毫秒为单位的超时以及为什么我必须为单独的 block 声明两个具有单独 run () 方法的类

java - 如何从另一个线程正确且适本地访问 SQLite 数据库 - Android

java - 是否可以更改 Java 中垃圾收集器的频率?

c# - .NET GC 删除正在使用的对象

java - 我可以轻松地将 EJB3 Remote 与 RAD 框架结合使用吗?

java - Maven 条件插件执行有一个扭曲

java - ThreadPoolExecutor#执行。如何复用正在运行的线程?

c++ - 多线程输入的基准 QTableWidget,奇怪的结果?

java - 尝试减少 java jdk 1.8.0 中的静态计数变量