Java并发编程的艺术学习笔记(三) Java内存模型(七)

3.7 happens-before

3.7.1 JMM的设计

设计意图:找到一个好的平衡点,一方面要为程序员提供足够强的内存可见性保证;另一方面,对编译器和处理器的限制要尽可能放松。

double pi=3.14;    //A
double r=1.0;    //B
double area=pi*r*r;    //C

(1)A happens-before B,(2)B ~ C,(3)A~ C

JMM把happens-before要求禁止的重排序分为了下面两类:

会改变程序执行结果的重排序(2和3)和不会改变程序执行结果的重排序(1)

前者必须禁止,后者不做要求。

只要不改变单线程和正确同步的多线程的执行结果

例如,编译器经过细致分析后,认定一个锁只会被单个线程访问,那么这个锁可以消除。一个volatile变量只会被单个线程访问,那么编译器会把它当作普通变量。这些优化既不会改变程序执行结果,又能提高执行效率。

3.7.2 happens-before的定义

happens-before关系本质上和as-if-serial语义是一回事

ais保证了单线程内程序执行结果不被改变。hb保证正确同步的多线程的执行结果不被改变。

都是为了在不改变程序执行结果的前提下,尽可能提高程序执行的并行度。

 

你可能感兴趣的:(Java,并发编程)