我在《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);
}
1条答案
按热度按时间jgzswidk1#
使
Holder
类不变,只需更改到
您还可以添加一个公共(非-
synchronized
)吸气剂法Holder.n
菲尔德,如果你愿意的话。拥有一个什么都不能使用的私有字段没有多大意义。(但是摆脱
assertSanity
因为它在地球上毫无用处。)当你做了以上的事,
Holder
对于n
字段,您不必担心该字段的不安全发布。