Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将成员作为参数传递给新线程时的局部变量引用和GC_Java_Multithreading_Garbage Collection - Fatal编程技术网

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的要求。