不可变对象和初始化安全

时间:2015-01-20 05:05:21

标签: java multithreading

我正在查看以下示例:

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.");
    }
}

// Unsafe publication
public Holder holder;

public void initialize() {
    holder = new Holder(42);
}

据说由于发布不当,程序将在多线程环境中失败。 我不明白的是,让我们说线程1调用intitialize()然后调用assertSanity()和线程2调用assertSanity()他们真的可以看到不同的n值吗?或者甚至将持有者值视为null然后初始化一个值?它说可以通过向n添加final修饰符来解决问题。有人可以帮我举个例子来说明这怎么可能出错?

我的问题似乎与Improper publication of Java Object Reference重复,但答案是迎合持有人的易变修饰符如何解决问题。我的问题是要了解如何使n作为最终修复问题。

0 个答案:

没有答案