3

清单 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

4

0 回答 0