重排序
什么是重排序
计算机在执行程序时,编译器、CPU、内存会对代码顺序、指令顺序、缓存前后关系进行重新排序,以达到提高性能的作用
为什么要重排序
对于CPU的流水线技术而言,指令重排序可以流水线的中断
常见的重排序
- 编译器优化重排
在不改变单线程语义的前提下,的重新安排语句顺序,如Java中多个函数的合并
- 指令重排
CPU流水线技术的重排序
- 内存系统重排
主要针对寄存器、读写缓冲、缓存
顺序一致性
介绍以下两个概念
数据竞争,即Java中的线程安全问题
顺序一致性
一个线程中的所有操作必须按照程序的顺序(即Java代码的顺序)来执行。 不管程序是否同步,所有线程都只能看到一个单一的操作执行顺序。即在顺序一致性模型中,每个操作必须是原子性的,且立刻对所有线程可见。
JMM中的一致性
如果程序是正确同步的,程序的执行将具有顺序一致性。 即程序的执行结果和该程序在顺序一致性模型中执行的结果相同。
说明Java未同步的代码不具备顺序一致性,而且同步块中的代码也可能因为编译优化进行重排序
happen-before
详见JSR-133
happen-before是为了让开发者便于理解JMM,而不需要关注具体的实现
