我正在阅读Java 8规范,我看到终结器可达的定义:
A finalizer-reachable object can be reached from some finalizable object through some chain of references, but not from any live thread.
代码中会出现什么样的情况?我不会对这样的事情有直觉。
答案 0 :(得分:2)
在下面的示例代码中,当Example
的实例无法访问时,os
引用的对象将是终结器可访问的。
public class Example {
private OutputStream os;
public Example(OutputStream os) {
this.os = 0s;
}
protected void finalize() {
try {
os.close();
} catch (IOException ex) {
// ignore it
}
}
}
但是,如果Example
实例不再有资格进行最终确定(例如,因为它已经先前完成,然后"复活"在最终确定期间),那么os
将不会终结可达的。
"终结者可达" state是关于指定在完成期间可能引用的对象不会过早删除。该规范没有说明如何确保这一点。我想Java代码(甚至本机代码)不可能确定特定对象是否是这种状态。
答案 1 :(得分:0)
你有一个对象Foo。 Foo是可终结的,并且在程序中的任何变量中都没有引用。 Foo有一名成员Bar。 Bar引用未在其他任何位置引用的对象。对象Bar引用因此终结器可达。
基本上它是一个无法再通过代码到达的对象,但可以通过另一个无法通过代码访问的对象来访问。