为什么这门课可能不安全发布?

时间:2017-09-24 02:03:20

标签: java multithreading concurrency

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的方法调用将被构造函数方法阻止,所以我认为在调用该方法时它将始终正确设置。

如果你能在这里建立一个可能导致竞争条件的子类,那将是很有帮助的。

0 个答案:

没有答案