考虑以下 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() 和一般方法之间的先行关系:
There is a happens-before edge from the end of a constructor of an object to the start of a finalizer (§12.6) for that object.
编辑:我认为有必要使我的问题更精确,所以这里尝试对问题进行精确的重新表述:
如果我保证,Java 是否保证特定方法 X.foo()
和 X.finalize()
之间存在happens-before 关系X.foo()
从未被任何finalize()
方法调用(直接或间接)?此处,happens-before 的解释与 §17.4.5 中的定义完全相同。 .
最佳答案
由于每个线程都有一个变量缓存,所以它不是线程安全的,在其他作品中每个线程都有自己的变量 View 。您可以将 volatine
应用于变量以强制线程加载变量。如果从 synchronized
block
关于java - 我可以假设 'no data race' 在 Java 中的用户线程和终结线程之间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20544677/