清单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.14中的不安全发布惯用语和线程 other 发布了清单3.15中的Holder, 与发布线程调用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
吗?