内存模型
在《Concurrent-Notes》中我们详细讨论了并发编程中的内存模型相关内容。
Java 内存模型(Java Memory Model, JMM)
由于现代计算机处理器与存储设备的运算速度存在几个数量级的差异,所以现代计算机都会在处理器与主内存之间加上高速缓存作为缓冲:将处理器计算所需数据复制到高速缓存,处理器直接从高速缓存中获取数据计算,同时处理器将计算结果放入缓存,再由缓存同步至主内存。
最早的
happens-before
- 程序次序规则:线程内的代码能够按先后顺序执行。
- 对于同一个锁,一个解锁操作一定要发生在时间上后发生的另一个锁定操作之前,也叫做管程锁定规则。
- 前一个对
volatile 的写操作在后一个volatile 的读操作之前,也叫volatile 变量规则。 - 一个线程内的任何操作必需在这个线程的
start() 调用之后,也叫作线程启动规则。 - 一个线程的所有操作都会在线程终止之前,线程终止规则。
- 一个对象的终结操作必需在这个对象构造完成之后,也叫对象终结规则。
对于程序次序规则来说,就是一段程序代码的执行在单个线程中看起来是有序的。注意,虽然这条规则中提到“书写在前面的操作先行发生于书写在后面的操作”,这个应该是程序看起来执行的顺序是按照代码顺序执行的,因为虚拟机可能会对程序代码进行指令重排序。虽然进行重排序,但是最终执行的结果是与程序顺序执行的结果一致的,它只会对不存在数据依赖性的指令进行重排序。因此,在单个线程中,程序执行看起来是有序执行的,这一点要注意理解。事实上,这个规则是用来保证程序在单线程中执行结果的正确性,但无法保证程序在多线程中执行的正确性。