清单 3.15。如果未正确发布,课程将面临失败风险。
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.");
}
}
如果清单 3.15 中的 Holder 使用清单 3.14 中的不安全发布习惯进行发布,并且发布线程以外 的线程要调用 assertSanity,它可能会抛出 AssertionError![15]
清单 3.14。在没有充分同步的情况下发布对象。不要这样做。
// Unsafe publication
public Holder holder;
public void initialize() {
holder = new Holder(42);
}
a) 第一个查询与发布线程本身有关,与其他线程无关。如果发布线程执行以下操作 -
1. Holder holder = new Holder (5);
2. holder.getN() // is it guaranteed that this will print 5
按程序顺序规则。线程中的每个动作都发生在该线程中的每个动作之前,这些动作在程序顺序的后面出现。
由于1 hb 2
上述规则,2 将能够看到 obj 正确分配给 holder。
但是是否可以保证 2 也能够看到持有者对象的安全构造,而没有以 n 声明为前缀的 final 修饰符?
public Holder(int n) { this.n = n; }
HB吗1
?