克服 Java 中的不当发布
Overcoming Improper Publication in Java
我在“Java 并发实践”一书中遇到了下面的 class。作者指出,在下面的示例中,Holder 的状态可能会过时,从而在调用 assertSanity 时导致 AssertionError。如何使下面的 Holder class 不可变来克服这个问题?
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
class 不可变,只需更改
private int n;
至
private final int n;
如果需要,您还可以为 Holder.n
字段添加 public(非 synchronized
)getter 方法。拥有一个任何人都无法使用的私人领域并没有多大意义。
(但去掉 assertSanity
因为它在世上没有用处。)
完成上述操作后,Holder
相对于 n
字段将是不可变的,您不必担心该字段的不安全 publication .
我在“Java 并发实践”一书中遇到了下面的 class。作者指出,在下面的示例中,Holder 的状态可能会过时,从而在调用 assertSanity 时导致 AssertionError。如何使下面的 Holder class 不可变来克服这个问题?
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
class 不可变,只需更改
private int n;
至
private final int n;
如果需要,您还可以为 Holder.n
字段添加 public(非 synchronized
)getter 方法。拥有一个任何人都无法使用的私人领域并没有多大意义。
(但去掉 assertSanity
因为它在世上没有用处。)
完成上述操作后,Holder
相对于 n
字段将是不可变的,您不必担心该字段的不安全 publication .