从JDK 5 开始,JMM就使用happens-before的概念来阐述多线程之间的内存可见性。在JMM中,如果一个操作执行的结果需要对另一个操作可见,
那么这2个操作之间必须要存在happens-before关系。这里提到的2个操作既可以是一个线程之内,也可以是不同线程之间。
与程序员密切相关的happens-before规则如下: 1、程序顺序规则:一个线程中的每个操作,happens-before于线程中的任意后续操作。 2、监视器锁规则:一个锁的解锁,happens-before于随后对这个锁的加锁。 3、volatile变量规则:对一个volatile域的写,happens-before于任意后续对这个volatile域的读。 4、传递性:如果A happens-before B,且Bhappens-before C,那么Ahappens-before C。
需要注意的是: 两个操作之间具有happens-before关系,并不意味着前一个操作必须要在后一个操作之前执行! happens-before仅仅要求前一个操作(执行的结果)对后一个操作可见,且前一个操作按顺序排在第 二个操作之前。 一个happens-before规则对应一个或多个编译器和处理器重排序规则。对于Java程序员来说, happens-before规则简单易懂,它避免Java程序员为了理解JMM提供的内存可见性保证而去 学习复杂的重排序以及这些规则的具体实现方法。