如果我有
public class Foo {
private boolean finalized = false;
public void foo() {
if (finalized)
throw new IllegalStateException("finalize() has been called.");
}
@Override public void finalize() {
super.finalize();
finalized = true;
}
}
是否有保证,即使面对多个线程,假设只有GC调用finalize(),IllegalStateException永远不会被抛出?
我知道,面对一个导致对象不可垃圾收集的finalize()方法,该对象不会被垃圾收集,并且可能会调用其他方法.但是这个finalize()不会这样做.在finalize()之后是否还有可能调用foo()?
解决方法:
完全可能的是,同时最终确定了一个引用Foo实例的不同对象 – 并且可以复活Foo对象,允许在完成后使用它.这有点粗鲁,但肯定会发生.
即使没有复活,另一个终结器也可以从终结器调用Foo.foo():
public class Bar {
private final Foo foo;
@Override protected void finalize() {
// The finalizer in foo may already have executed...
foo.foo();
}
}