重排序

什么是重排序

计算机在执行程序时,编译器、CPU、内存会对代码顺序、指令顺序、缓存前后关系进行重新排序,以达到提高性能的作用

为什么要重排序

对于CPU的流水线技术而言,指令重排序可以流水线的中断

常见的重排序

  • 编译器优化重排

在不改变单线程语义的前提下,的重新安排语句顺序,如Java中多个函数的合并

  • 指令重排

CPU流水线技术的重排序

  • 内存系统重排

主要针对寄存器、读写缓冲、缓存

顺序一致性

介绍以下两个概念
数据竞争,即Java中的线程安全问题

顺序一致性

一个线程中的所有操作必须按照程序的顺序(即Java代码的顺序)来执行。 不管程序是否同步,所有线程都只能看到一个单一的操作执行顺序。即在顺序一致性模型中,每个操作必须是原子性的,且立刻对所有线程可见。

JMM中的一致性

如果程序是正确同步的,程序的执行将具有顺序一致性。 即程序的执行结果和该程序在顺序一致性模型中执行的结果相同。

说明Java未同步的代码不具备顺序一致性,而且同步块中的代码也可能因为编译优化进行重排序

happen-before

详见JSR-133
happen-before是为了让开发者便于理解JMM,而不需要关注具体的实现
image.png