我试图从根本上理解在以下情况下传递给线程的局部变量会发生什么。我需要在 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/