什么是指令重排序

  java语言规范JVM线程内部维持顺序化语义,即只要程序的最终结果与它顺序化情况的结果相等,那么指令的执行顺序可以与代码逻辑不一致,这个过程就叫做执行重排序;

  在执行程序时,为了提高性能,编译器和处理器常常会对指令做重排序,重排序分为三种类型:

    1.编译器优化的重排序:编译器在不改变单线程程序的语义下,可以重新安排语句的执行顺序;

    2.指令级并行重排序:线程处理器采用了指令级并行技术来将多条指令重叠执行;如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序;

    3.内存系统重排序:由于处理器使用缓存和读/写缓冲区,这使得加载和存储操作看上去可能是在乱执行;

  最终执行的指令序列示意图

    

  上述的1属于编译器重排序,2和3属于处理器重排序;这些重排序可能会导致多线程程序出现内存可见性问题;对于编译器,JMM的编译器重排序规则会禁止特定类型的编译器重排序;对于处理器重排序,JMM的处理器重排序规则会要求java编译器在生成指令序列时,插入特定类型的内存屏障指令,通过内存屏障指令来禁止特定类型处理器重排序;

内存屏障

  为了保证可见性,java编译器在生成指令序列的适当位置会插入内存屏障指令来禁止特定类型的处理器重排序;

  内存屏障类型表

    

    StoreLoad Barriers是一个“全能型”的屏障,它同时具有其他三个屏障的效果;

 

 posted on 2020-03-27 13:43  wnwn  阅读(424)  评论(0编辑  收藏  举报