重排序
在执行程序时,为了提供性能,处理器和编译器经常会对指令进行重排序,知足如下两个条件:并发
- 在单线程环境下不能改变程序运行的结果;
- 存在数据依赖关系的不容许重排序
happens - before
原则定义
-
- 若是一个操做happens-before另外一个操做,那么第一个操做的执行结果将对第二个操做可见,并且第一个操做的执行顺序排在第二个操做以前。
-
- 两个操做之间存在happens-before关系,并不意味着必定要按照happens-before原则制定的顺序来执行。若是重排序以后的执行结果与按照happens-before关系来执行的结果一致,那么这种重排序并不非法。
原则规则
- 程序次序规则:一个线程内,按照代码顺序,书写在前面的操做先行发生于书写在后面的操做;
- 锁定规则:一个unLock操做先行发生于后面对同一个锁额lock操做;
- volatile变量规则:对一个变量的写操做先行发生于后面对这个变量的读操做;
- 传递规则:若是操做A先行发生于操做B,而操做B又先行发生于操做C,则能够得出操做A先行发生于操做C;
- 线程启动规则:Thread对象的start()方法先行发生于此线程的每一个一个动做;
- 线程中断规则:对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生;
- 线程终结规则:线程中全部的操做都先行发生于线程的终止检测,咱们能够经过Thread.join()方法结束、Thread.isAlive()的返回值手段检测到线程已经终止执行;
- 对象终结规则:一个对象的初始化完成先行发生于他的finalize()方法的开始;
连接
【死磕Java并发】—–Java内存模型之重排序app
【死磕Java并发】—–Java内存模型之happens-before性能