考虑以下 Java 类:
class X {
public void foo() {
bar = 1;
}
protected void finalize() {
if (bar == 1)
baz();
}
private int bar = 0;
}
X.foo()
在从未从任何方法(直接或间接)调用的假设下,finalize()
我可以确定上面的代码没有数据竞争,也就是说,我可以确定在实际情况下X.finalize()
看到写入的值叫?X.foo()
X.foo()
天真的分析会说X.finalize()
不能同时运行X.foo()
(由于提到的假设),所以不需要额外的同步。
我猜上面的代码没有数据竞争,但令我困扰的是,语言规范在§17.4.5中包含以下明确声明,但没有说明 finalize() 和一般方法之间的发生前关系:
从对象的构造函数的末尾到该对象的终结器(第 12.6 节)的开头有一条发生前边缘。
编辑:我认为有必要使我的问题更精确,所以这里尝试对问题进行精确的重新表述:
Java 是否保证特定方法之间的发生之前的X.foo()
关系,X.finalize()
如果我保证X.foo()
永远不会从任何finalize()
方法调用(直接或间接)?在这里,happens-before将完全按照§17.4.5中的定义进行解释。