JCIP-不安全的发布,并且在发布线程之前发生

时间:2018-11-28 14:03:32

标签: java multithreading

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

0 个答案:

没有答案