克服Java中的不当发布



我在书中遇到了下面的类"Java并发在实践中";。作者指出,在下面的例子中,Holder的状态可能是过时的,导致在调用assertSanity时出现AssertionError。如何使下面的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;

private final int n;

如果你愿意的话,你也可以为Holder.n字段添加一个公共的(非synchronized(getter方法。

(但去掉assertSanity,因为它在地球上没有任何用处。(

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

最新更新