如果一个操作 happens-before(先行发生) 另一个操作,那么第一个操作执行结果对第二个操作可见,而且第一个操作的执行顺序排在第二个操作之前。
意义
解决重排序和 CPU 缓存
规则
-
程序顺序规则
在一个线程内部,按照代码的书写顺序执行
-
锁定规则
对锁 M 解锁之前的所有操作 happens - before 对锁 M 加锁之后的所有操作
-
volatile 变量规则
对一个 volatile 变量的写操作以及这个 写操作之前的所有操作
happens-before 这个变量的读操作以及这个 读操作之后的所有操作
-
线程启动规则
主线程 A 执行过程中,启动子线程 B,那么线程 A 在启动子线程 B 之前,对共享变量的修改结果对线程 B 可见
-
线程终止规则
在主线程 A 执行过程中,子线程 B 终止,那么线程 B 在终止之前对共享变量的修改结果对线程 A 可见
-
线程中断规则
对线程 interrupt() 方法的调用先行发生于被中断线程代码检测到中断事件的发生,可以通过 Thread.interrupted检测是否发生中断
-
传递规则
a happens-before b ,b happens-before c,那么 a happens-before c
-
对象终结规则
构造函数的结束一定 happens-before 它的 finalize
其他规则
- 将一个元素放入一个线程安全的队列操作 happens-before 从这个队列中取出这个元素的操作
- 将一个元素放入一个线程安全容器的操作 happens-before 从容器中取出这个元素的操作
- 在 countdownlatch中,倒数操作 happens-before await()操作
内存屏障
让一个 CPU 处理单元中,内存状态对其他处理单元可见的一项技术
- 阻止没有数据依赖性的代码进行指令重排序,保证有序性
- 强制把写缓冲区、高速缓存中的脏数据写回主内存,让缓存数据失效,保证数据的可见性
原文
http://mousycoder.com/thinking-in-jvm/68/