从java代码到指令序列的重排序

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

  • 编译器优化的重排序。在不改变程序语义的前提下,可以改变执行顺序。如下:
a = 1;
b = 2;
// 重排序后 ====>
b = 2;
a = 1;
  • 指令级并行的重排序。如果不存在数据依赖性,处理器可以改变语句对应的机器指令的执行顺序。比如singleton = new Singleton()这一句java代码会被JVM生成如下三条指令,但是因为指令2和3之间没有数据依赖性,所以可能被处理器重排而先执行指令3。
  1. 分配内存对象;
  2. 调用构造器初始化;
  3. 构建对象引用指向内存对象。
  • 内存系统的重排序。由于处理器使用了缓存和读写缓冲区,这使得读和写看上去可能是在乱序执行。翻译一下,就是处理器修改了变量a的值,但是出于性能考虑并没有立即回写到内存,然后处理器又去内存里面读取了变量b,最后处理器执行完后才将变量a写回到内存,所以真正执行指令的时候写变量a的指令是在读变量b指令之后,但事实上写a是先发生的。
posted @ 2022-05-29 14:48  学海无涯#  阅读(134)  评论(0)    收藏  举报