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