美文网首页
Java发生指令重排的几个地方

Java发生指令重排的几个地方

作者: 名字是乱打的 | 来源:发表于2021-09-05 23:30 被阅读0次

一.指定重排的原则

编译器和处理器不是胡乱的重排序的,他们会遵循一个关键的规则,就是数据依赖规则,如果说一个变量的结果依赖于之前的代码执行结果,那么就不能随意进行重排序,要遵循数据的依赖。

二.指定重排的位置

2.1 编译时

编译后的代码的执行顺序:java里有两种编译器,一个是静态编译器(javac),一个是动态编译器(JIT)

  • javac负责把.java文件中的源代码编译为.cass文件中的字节码,这个一般是程序写好之后进行编译的。
  • JIT负责把.class文件中的字节码编译为JVM所在操作系统支持的机器码,一般在程序运行过程中进行编译。

在这个编译的过程中,编译器了提高代码的执行效率,很可能会调整代码的执行顺序。

2.2 处理器执行时候

即使我们给处理器一个代码的执行顺序,处理器也可能会重排代码,更换一种执行顺序。

2.3 内存重排序

有可能一个处理器在实际执行的过程中,在写缓冲器,高速缓存等等一些硬件也能导致指令执行顺序和我们想象的不一样。


如图所示,画红圈的都是可能发生指定重排的地方

相关文章

  • Java发生指令重排的几个地方

    一.指定重排的原则 编译器和处理器不是胡乱的重排序的,他们会遵循一个关键的规则,就是数据依赖规则,如果说一个变量的...

  • Java多线程实现基础(二)

    Java内存模型 基本概念 指令重排 jvm 指令执行

  • Java指令重排序

    Java指令重排序Java内存模型允许编译器和处理器对指令重排序以提高运行性能,并且只会对不存在数据依赖性的指令重...

  • java指令重排

    ** 为何要指令重排? ** 现在的CPU一般采用流水线来执行指令。一个指令的执行被分成:取指、译码、访存、执...

  • 单例模式

    参考文章 一、为什么要加 volatile 在编译器中可能发生指令重排 在非正常情况下,发生指令重排,会先将 t ...

  • 单例模式注意事项

    单例中的类变量定义加 volatile : 禁止java指令重排序

  • Java指令重排序与volatile关键字

    Java指令重排序与volatile关键字 1. 重现代码重排序 1.1 测试代码 完整代码参见Github,其中...

  • 双重检查锁定(double-checked locking)与单

    可以使用volatile变量禁止指令重排序,让DCL生效: [java]view plaincopy packag...

  • java volatile

    重排序 在Java内存模型中,为了效率是允许编译器和处理器对指令进行重排序,重排序它不会影响单线程的运行结果,但是...

  • 指令重排(Happens-Before法则)

    1.什么是指令重排 程序指令的执行顺序有可能和代码的顺序不一致,这个过程就称之为指令重排。 2.指令重排的作用 J...

网友评论

      本文标题:Java发生指令重排的几个地方

      本文链接:https://www.haomeiwen.com/subject/sigswltx.html