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

时间:2017-01-30 16:24:36

标签: 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));
}

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

我读了一下关于volatile关键字的内容,但我不确定它会在这里帮助我。

1 个答案:

答案 0 :(得分:2)

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