gpt4 book ai didi

java - 如何确保始终调用 finalize()(Thinking in Java 练习)

转载 作者:搜寻专家 更新时间:2023-10-30 19:42:34 26 4
gpt4 key购买 nike

我正在慢慢研究 Bruce Eckel 的 Thinking in Java 第 4 版,但以下问题让我感到困惑:

Create a class with a finalize( ) method that prints a message. In main( ), create an object of your class. Modify the previous exercise so that your finalize( ) will always be called.

这是我编写的代码:

public class Horse {
boolean inStable;
Horse(boolean in){
inStable = in;
}
public void finalize(){
if (!inStable) System.out.print("Error: A horse is out of its stable!");
}
}
public class MainWindow {
public static void main(String[] args) {
Horse h = new Horse(false);
h = new Horse(true);
System.gc();
}
}

它创建一个新的 Horse 对象, boolean 值 inStable 设置为 false。现在,在 finalize() 方法中,它检查 inStable 是否为 false。如果是,它会打印一条消息。

不幸的是,没有打印任何消息。由于条件评估为 true,我的猜测是 finalize() 一开始就没有被调用。我已经多次运行该程序,并且只看到错误消息打印了几次。我的印象是,当 System.gc() 被调用时,垃圾收集器将收集任何未被引用的对象。

谷歌搜索正确答案给了我 this link ,它提供了更详细、更复杂的代码。它使用了我以前从未见过的方法,例如 System.runFinalization()Runtime.getRuntime()System.runFinalizersOnExit().

有没有人能让我更好地理解 finalize() 的工作原理以及如何强制它运行,或者让我了解解决方案代码中正在做什么?

最佳答案

当垃圾收集器发现一个符合收集条件但具有finalizer 的对象时,它不会立即释放它。垃圾收集器会尝试尽快完成,因此它只是将对象添加到具有挂起终结器的对象列表中。稍后在单独的线程上调用终结器。

您可以通过调用 System.runFinalization 方法告诉系统立即尝试运行挂起的终结器。在垃圾收集之后。

但是如果你想强制运行终结器,你必须自己调用它。垃圾收集器不保证将收集任何对象或调用终结器。它只会做出“最大努力”。但是,您很少需要强制终结器在实际代码中运行。

关于java - 如何确保始终调用 finalize()(Thinking in Java 练习),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12030641/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com