【发布时间】:2016-10-14 06:57:00
【问题描述】:
如果我有
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() 并没有这样做。 foo() 是否还有可能在finalize() 之后被调用?
【问题讨论】:
-
您的意思是要问,'在 GC 调用 finalize 之后?'否则,某些白痴可能会明确要求您这样做。
-
@bmargulies 谢谢,这就是我的意思。
-
您应该按照 Object not public 中最初定义的方式保护此方法以限制风险