如果我有

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()

最佳答案

完全有可能同时完成对 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/

10-11 00:07