克服Java中的不当发布

克服Java中的不当发布,java,java.util.concurrent,java-threads,Java,Java.util.concurrent,Java Threads,我在《实践中的Java并发性》一书中遇到了下面的类。作者声明,在下面的示例中,持有者的状态可能是陈旧的,在调用assertSanity时会导致AssertOnError。如何使下面的Holder类保持不变以克服此问题 public class Holder{ private int n; public Holder(int n) { this.n = n;} public void assertSanity() { if(n != n) throw

我在《实践中的Java并发性》一书中遇到了下面的类。作者声明,在下面的示例中,持有者的状态可能是陈旧的,在调用assertSanity时会导致AssertOnError。如何使下面的Holder类保持不变以克服此问题

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);
}
要使Holder类不可变,只需更改

  private int n;

如果愿意,还可以为Holder.n字段添加一个公共的非同步getter方法。拥有一个没有任何东西可以使用的私有字段没有多大意义

但要摆脱资产理智,因为它在尘世上毫无用处

当您完成上述操作后,Holder对于n字段是不可变的,您不必担心该字段的不安全发布

  private final int n;