我试图从根本上理解在以下情况下传递给线程的局部变量会发生什么。我需要在具有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));
}
当程序正在执行时,SomeClass的某些实例会在线程能够调用删除之前进行GC吗?每个线程是否会收到自己的新副本,或者是否会对someObject
的最后一个设置值进行操作?
我读了一下关于volatile
关键字的内容,但我不确定它会在这里帮助我。
答案 0 :(得分:2)
没有。您要将这些someObject::delete
方法引用添加到Runtime
中的集合中。由于Runtime
仍然可以访问,因此这些对象也可以访问,并且不应该获得GCd。