一.定义
happens-brfore是用来指定两个操作之间的执行顺序,用来保证可见性。
在java内存模型中,如果一个操作执行的结果要对另一个操作可见,那么这两个操作之间存在happens-before关系
二.happens-before规则
1.程序顺序规则
单线程中每个操作,总是前一个操作happens-before后一个操作
2.监视器锁规则
对一个锁的解锁,总是happens-before于对这个锁的加锁
3.volatile变量规则
对一个volatile修饰变量的写happens-before于 任意后续对这个变量的读
4.传递性
A happens-before B ,B happens-before C ——> A happens-before C
5.Start规则
一个线程调用另一个线程,A线程中代码 happens-before B线程
6.Join规则
A线程jionB线程,B线程代码 happens-before A线程
三.重排序问题
1. 编译器和处理器为了提高程序运行性能,代码之间单线程环境下不存在依赖性时可能会发生重排序
2.数据依赖性:
(1)没有依赖性
(2)有依赖性 :写后读 读后写 写后写
3.as-if-serial规则:不管指令怎么进行重排序,单线程下程序的执行结果都不会发生改变
4.指令重排序的分类?
(1)编译器重排序
(2)处理器重排序(CPU 本地内存 主内存)
5.指令重排序为什么能提高效率?
因为可以在不改变语义的前提下,尽量减少寄存器的读取,存储次数
(假设指令1 赋值给变量A并存放如寄存器, 指令2与A无关但要占用寄存器,第三条指令读取A,又要将A读取如寄存器,这时可以将2,3互换,这样可以使原来的指令3直接读取寄存器中的A)