1、happens-before是JMM最核心的概念,JSR-133使用happens-before来指定两个操作之间的执行顺序。
2、如果A happens-before B,那么:
(1)对程序员来说:A的执行结果对B可见,并且A的执行顺序排在B之前。
(2)对编译器和处理器来说:不一定要按照程序顺序执行,在不改变程序执行结果(指单线程或正确同步的多线程)的前提下,允许重排序。
3、happens-before规则:
(1)程序顺序规则:一个线程中的每个操作,happens-before于该线程中的任意后续操作。
(2)监视器规则:对一个锁的解锁,happens-before于随后对这个锁的加锁。
(3)volatile变量规则:对一个volatile域的写,happens-before于任意后续对这个volatile域的读。
(4)传递性:如果A happens-before B,且B happens-before C,那么A happens-before C。
(5)start()规则:如果线程A执行操作ThreadB.start()(启动线程B),那么A线程的ThreadB.start()操作happens-before于线程B中的任意操作。
(6)join()规则:如果线程A执行操作ThreadB.join()并成功返回,那么线程B中的任意操作happens-before于线程A从ThreadB.join()操作成功返回。
4、volatile和锁都可以建立happens-before关系,它们的内存语义比较:
(1)volatile可以保证单个变量的读/写具有原子性,锁的互斥可以保证整个临界区代码的执行具有原子性。
(2)在功能上,锁比volatile更强大,在可伸缩性和执行性能上volatile则更有优势。
(3)线程A写一个volatile变量,实质上是线程A向接下来将要读这个volatile变量的某个线程发出了(其对共享变量所做修改的)消息。
(4)线程B读一个volatile变量,实质上是线程B接收了之前某个线程发出的消息。
(5)锁释放与volatile写有相同的内存语义,锁获取与volatile读具有相同的内存语义。
5、JMM是一个语言级的内存模型,处理器内存模型是硬件级的内存模型,顺序一致性内存模型是一个理论参考模型。