原文见 http://ifeve.com/java-memory-model-0/
文章讲得很细致了,关键几点:
0、数据依赖和控制依赖的概念。
1、原来只知道重排序是编译时(编译器行为)和运行时(虚拟机行为)产生的,目的是提高性能;此文交代了运行时重排序是由于cpu写缓冲出于性能考量没有及时刷到内存,导致事实上的重排序。cpu多级缓存之于内存,就像内存之于硬盘。(阅读CSAPP E2 6.4.5可知,L1 cache和CPU的速度是匹配的,此处往往采用write-through策略;约往下层走,每一层速度都差了一个数量级,采用write-back会更经济)
扩展阅读:http://faculty.kfupm.edu.sa/COE/mudawar/coe502/lectures/05-Consistency.ppt
2、jsr133为什么要增强volatile和final的语义,以及为何要避免this在构造结束前逸出。
3、happens-before原则的本质是jmm对运行时重排序的限制(即哪些不能重排序),用以达到语义上的顺序一致性。