我正在查看“Java Concurrency in Practice”一书,发现下面引用的陈述真的很难相信(但不幸的是它是有道理的)。
http://www.informit.com/store/java-concurrency-in-practice-9780321349606
只是想弄清楚这 100%
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.");
}
}
虽然在构造函数中设置的字段值似乎是写入这些字段的第一个值,因此没有“旧”值可以视为陈旧值, 但 Object 构造函数首先在子类构造函数运行之前将默认值写入所有字段. 因此,可以将字段的默认值视为陈旧值
关于上面的粗体声明,
我知道这种行为,但现在很明显,构造函数的这种调用层次结构不能保证是原子的(在由锁保护的单个同步块中调用超级构造函数),但是解决方案是什么?想象一个具有多个级别的类层次结构(即使不推荐,让我们假设它是可能的)。上面的代码片段是我们在大多数项目中每天都能看到的一种原型。