我正在查看以下示例:
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作为最终修复问题。