java – 在finalize()之后可以调用其他方法吗?

如果我有

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();
    }
}
上一篇:你再也不用使用 Redux、Mobx、Flux 等状态管理了


下一篇:final、finally、finalize()的区别(skycto JEEditor)