如果我有
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();
}
}
关于java - finalize()之后可以调用其他方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37796826/