Java可以在对象仍在范围内时完成它吗?
我一直在研究代码中的一个错误,它似乎是由一些“丑陋”的终结器代码引起的。代码大致如下所示
public class A {
public B b = new B();
@Override public void finalize() {
b.close();
}
}
public class B {
public void close() { /* do clean up our resources. */ }
public void doSomething() { /* do something that requires us not to be closed */ }
}
void main() {
A a = new A();
B b = a.b;
for(/*lots of time*/) {
b.doSomething();
}
}
我认为正在发生的事情是,在完成器线程的第二行之后被检测为没有引用,并且由终结器线程进行GC和最终确定 - 当循环仍在发生时,使用while仍在“范围内”。a
main()
for
b
a
这合理吗?Java是否允许在对象超出范围之前对其进行GC?
注意:我知道在终结器中做任何事情都是不好的。这是我继承并打算修复的代码 - 问题是我是否正确理解了根本问题。如果这是不可能的,那么更微妙的东西一定是我的错误的根源。