Java并发编程的艺术(六)happens-before

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是一个语言级的内存模型,处理器内存模型是硬件级的内存模型,顺序一致性内存模型是一个理论参考模型

posted on 2019-07-21 16:16  逍遥1989  阅读(132)  评论(0编辑  收藏  举报