克服java中的不当发布

r1zk6ea1  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(318)

我在《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);
}
jgzswidk

jgzswidk1#

使 Holder 类不变,只需更改

private int n;

private final int n;

您还可以添加一个公共(非- synchronized )吸气剂法 Holder.n 菲尔德,如果你愿意的话。拥有一个什么都不能使用的私有字段没有多大意义。
(但是摆脱 assertSanity 因为它在地球上毫无用处。)
当你做了以上的事, Holder 对于 n 字段,您不必担心该字段的不安全发布。

相关问题