Java并发11:happens-before原则 - JMM的核心规则
引言:如何判断程序是否线程安全? 看这段代码,能否确定线程安全? public class DataRace { private int data = 0; private boolean ready = false; // 线程1 public void writer() { data = 42; // 1 ready = true; // 2 } // 线程2 public void reader() { if (ready) { // 3 System.out.println(data); // 4 一定输出42吗? } } } 三个问题: 线程2能看到ready = true吗?(可见性) 如果看到ready = true,能保证看到data = 42吗?(有序性) 如何用形式化的规则判断? 传统方法是分析各种可能的执行顺序,但这太复杂了! JMM的解决方案:happens-before原则 happens-before是JMM的核心规则,它定义了: 什么时候一个操作的结果对另一个操作可见 什么时候两个操作不能重排序 如何建立正确的并发语义 掌握happens-before原则,就能快速判断程序是否线程安全。 一、happens-before的定义 1.1 形式化定义 happens-before关系(简写为 hb): 如果操作A happens-before 操作B,记作 A hb B,则: 可见性保证:A的结果对B可见 有序性保证:A在B之前执行(从程序语义角度) 注意: ...