指令重排序
在执行程序时,为了提高性能,编译器和处理器通常会对指令做重排序,重排序分为3种类型:
- 编译器优化的重排序:编译器在不改变单线程语义的前提下,可以重新安排语句的执行顺序
- 指令级并行的重排序:现代处理器采用了指令级并行技术(ISP)来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应的机器指令的执行顺序。
- 内存系统的重排序:由于处理器使用缓存和读写缓冲区,这使得加载和存储操作看上去可能是在乱序执行。
graph LR A[源代码] --> B[编译器优化重排序] --> C[指令级并行重排序] --> D[内存系统重排序] --> E[最终执行的指令序列]
对于处理器重排序,JMM的处理器重排序规则会要求Java编译器在生成指令序列时,插入特定类型的内存屏障(Memory Barriers)指令,通过内存屏障指令来禁止特定类型的处理器重排序。
JMM属于语言级的内存模型,它确保在不同的编译器和不同的处理器平台之上,通过禁止特定类型的编译器重排序和处理器重排序,为程序员提供一致的内存可见性保证。
资料:https://www.bilibili.com/video/BV1vN411T7yu/ 强推 河北王校长