我正在学习Java:CIP,并遇到了一些非常奇怪的声明:
// Unsafe publication
public Holder holder;
public void initialize() { holder = new Holder(42);}
现在我明白了:如果某个线程更新了对Holder
对象的引用,则其他线程可能看不到该对象,因为尚未同步对其的访问。但是作者继续写道:“但更糟糕的是,其他线程可能会看到Holder参考的最新值,而对于Holder的状态却是陈旧的值。为了使事情更不可预测,一个线程可能会看到第一次读取字段时使用陈旧值,然后下次读取时使用最新值,这就是assertSanity会引发AssertionError的原因。
public class Holder {
private int n;
public Holder(int n) { this.n = n; }
public void assertSanity() { if (n != n)
throw new AssertionError("This statement is false.");
}
}
有人可以向我解释这怎么可能吗?
谢谢!