public class Holder {
private int n;
public Holder(int n) {
this.n = n;
}
public void assertSanity() {
if(n != n) {
throw new AssertionError("something is wrong!");
}
}
}
此代码段来自JCIP清单3.15。在脚注上说:
虽然看起来构造函数中设置的字段值是写入这些字段的第一个值,因此没有“较旧” 要将值视为过时值,Object构造函数首先在子类构造函数运行之前将默认值写入所有字段。因此 可以将字段的默认值看作陈旧值。
如果类只有这些变量和方法,我很困惑,即使子类实例化,它怎么可能不是线程安全的?因为对assertSanity
的方法调用将被构造函数方法阻止,所以我认为在调用该方法时它将始终正确设置。
如果你能在这里建立一个可能导致竞争条件的子类,那将是很有帮助的。