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

标签 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();
    }
}

关于java - finalize()之后可以调用其他方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37796826/

相关文章:

xcode - 如何从 Xcode 导出完成的应用程序?

java - 登录后设置 session 属性

java - Web 服务 - Java 还是 .NET?

Kotlin super.finalize()

c# - close, dispose, finalize, GC, Idisposable,....你对它们有清楚的描述吗?

java - Finalize 方法会在不覆盖它的情况下运行吗?

java - 共享OpenGL资源: delete with finalize() or implement reference counting?

java - CompletableFuture 如何知道任务是独立的?

java - 将 vararg 参数传递给 Kotlin 中的另一个函数时出现编译时错误

java - 为什么Android中只能UI线程更新UI?