我正在阅读关于线程和锁的 JLS 文档http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.5。
class FinalFieldExample {
final int x;
int y;
static FinalFieldExample f;
public FinalFieldExample() {
x = 3;
y = 4;
}
static void writer() {
f = new FinalFieldExample();
}
static void reader() {
if (f != null) {
int i = f.x; // guaranteed to see 3
int j = f.y; // could see 0
}
}
}
我对本节中提到的上述示例(例如第 17.5-1 号)感到困惑,关于如何将 fy 视为零。Reader Threads 要么将对象 f 读取为 null,在这种情况下它不会执行任何操作,要么它将读取带有一些引用的对象 f。如果对象 f 有一个引用,那么即使多个写入线程正在运行,构造函数也必须完成其执行,以便可以将引用分配给 f,如果构造函数已经执行,则 fy 应该被视为 4。
在什么条件下 fy =0 是可能的?
谢谢