Java 将成员作为参数传递给新线程时的局部变量引用和GC
我试图从根本上理解,在以下情况下,传递给线程的局部变量会发生什么变化。我需要在Java 将成员作为参数传递给新线程时的局部变量引用和GC,java,multithreading,garbage-collection,Java,Multithreading,Garbage Collection,我试图从根本上理解,在以下情况下,传递给线程的局部变量会发生什么变化。我需要在someObject上执行清理操作,该对象有一个delete方法,该方法调用一个外部API来按其成员id删除someObject的实例 public interface Deleteable { public delete() } public SomeClass implements Deleteable { int id; public void delete() { H
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));
}
公共接口可删除{
公共删除()
}
公共类实现了可删除{
int-id;
公共作废删除(){
HttpApiCall.deleteById(this.id);
}
}
SomeClass someObject=null;
对于(i=0;i<3;i++){
//简单的循环来说明问题
someObject=新的SomeClass();
Runtime.getRuntime()
.addShutdownHook(新线程(someObject::delete));
}
当程序执行时,在线程能够调用delete之前,SomeClass的一些实例是否会被GC’ed?每个线程是否会收到自己的新副本,或者是否会对someObject
的最后一个设置值进行操作
我读了一点关于
volatile
关键字的内容,但我不确定它是否对我有帮助。否。您正在运行时中将这些someObject::delete
方法引用添加到集合中。由于运行时
仍然可以访问,因此这些对象也是可以访问的,不应该获得GCd。否。您正在将这些someObject::delete
方法引用添加到运行时
中的集合中。由于运行时
仍然是可访问的,因此这些对象也是可访问的,不应该获得GCd。如果没有调用关闭钩子,情况有多严重?因为这是可能的。你能进一步解释一下在什么情况下不会调用shutdownhook吗?都在javadoc中。如果shutdownhook没有被调用,情况有多严重?因为这是可能的。你能进一步解释一下在什么情况下不会调用shutdownhook吗?都在javadoc中。更不用说它是从一个未启动的线程引用的,更不用说它不符合GC的条件。更不用说它是从一个未启动的线程引用的,确保它不符合GC的要求。