那说说什么是指令重排?

为了提高性能,编译器和处理器通常会对指令进行重排序。重排序可以分为以下三种类型:

  1. 编译器优化的重排序:编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序以提高性能。
  1. 指令级并行的重排序:现代处理器采用指令级并行技术(Instruction-Level Parallelism,ILP)来实现多条指令的重叠执行。如果不存在数据依赖关系,处理器可以改变指令对应的机器指令的执行顺序。
  2. 内存系统的重排序:由于处理器使用缓存和读/写缓冲区,加载和存储操作可能会以乱序的方式执行。

在Java程序的执行过程中,从源代码到最终实际执行的指令序列,可能会经历以上三种重排序,如下图所示:

javathread-21.png

双重校验单例模式是一个经典的指令重排例子。具体而言,对于语句Singleton instance = new Singleton();,JVM的指令可以分为三步:分配内存空间、初始化对象、对象指向分配的内存空间。然而,由于编译器的指令重排优化,第二步和第三步的顺序可能会发生变化。

JMM(Java内存模型)是一种语言级的内存模型,它确保在不同的编译器和处理器平台上,通过禁止特定类型的编译器重排序和处理器重排序,为程序员提供一致的内存可见性保证。

标签: none