指令重排序是指编译器或CPU为了优化程序的执行性能而对指令进行重新排序的一种手段,重排序会带来可见性问题,所以在多线程开发中必须要关注并规避重排序。
从源代码到最终运行的指令,会经过如下两个阶段的重排序。
第一阶段,编译器重排序,就是在编译过程中,编译器根据上下文分析对指令进行重排序,目的是减少CPU和内存的交互,重排序之后尽可能保证CPU从寄存器或缓存行中读取数据。
在前面分析JIT优化中提到的循环表达式外提(Loop Expression Hoisting)就是编译器层面的重排序,从CPU层面来说,避免了处理器每次都去内存中加载stop,减少了处理器和内存的交互开销。

第二阶段,处理器重排序,处理器重排序分为两个部分。
并行指令集(CPU)重排序,这是处理器优化的一种,处理器可以改变指令的执行顺序。
内存系统“重排序”,这是处理器引入Store Buffer缓冲区延时写入产生的指令执行顺序不一致的问题;内存系统内不存在真正的重排序,但是内存会带来看上去和重排序一样的效果。
由于内存有缓存的存在,在 JMM 里表现为主存和本地内存,而主存和本地内存的内容可能不一致,所以这也会导致程序表现出乱序的行为。

JMM结构:抽象了线程和主内存之间的关系,就比如说线程之间的共享变量必须存储在主内存中

  • 主内存 :所有线程创建的实例对象都存放在主内存中,不管该实例对象是成员变量还是方法中的本地变量(也称局部变量)
  • 本地内存 :每个线程都有一个私有的本地内存来存储共享变量的副本,并且,每个线程只能访问自己的本地内存,无法访问其他线程的本地内存。本地内存是 JMM 抽象出来的一个概念,存储了主内存中的共享变量副本。

java指令重排,为什么重排?相关推荐

  1. BeanShell中的Java指令和表达式

    我的博客原址:点击此处 BeanShell 能够理解标准的 Java 指令,表达式和方法的语法.那些指令和表达式都是在一个 Java 方法中你会提到的非常常见的东西,像变量的定义和分配,方法调用,循环 ...

  2. java 指令重拍_我发现我的Java重拍了!

    java 指令重拍 在一月份,我写了一篇文章,介绍了一些我希望在Java语言中看到的变化,这些变化会让我更加喜欢它(并使它变得更现代). 很多人建议使用许多JVM语言,但我很大程度上不予理会,因为这不 ...

  3. java指令和javac指令总结

    假如在D:\Java存放了两个java源文件:MyJava.java,Fighting.java MyJava.java如下: public class MyJava {  public static ...

  4. c如何接收java指令_java指令和javac指令总结

    假如在D:\Java存放了两个java源文件:MyJava.java,Fighting.java MyJava.java如下: public class MyJava { public static ...

  5. JVM:Java指令源码opcode

    JVM:Java指令源码opcode 关键词 Java 字节码是沟通 JVM 与 Java 程序的桥梁 指令( opcode)由操作码和操作数组成 JVM 翻译字节码( 将 opcode + 操作数翻 ...

  6. java菜鸟2:java指令

    java指令    http://download.csdn.net/detail/jji8877032/9152033 反编译 javap -verbose xxx.class

  7. Java 指令与字节码

    Java 指令与字节码 查看class文件 编写简单java代码 编译代码 查看class文件 Java字节码总的结构表 常量池 常量池容量计数器 字面量和符号引用 全限定名 简单名称 描述符 常量类 ...

  8. Java指令-Djava.ext.dirs的陷阱

    Java指令-Djava.ext.dirs的陷阱 https://blog.csdn.net/cyony/article/details/74375251 这两天由于现场需求,需要把ES索引写入插件改 ...

  9. 一篇讲Java指令重排和内存可见性的好文

    在这里: http://tech.meituan.com/java-memory-reordering.html 指令重排和内存可见性(缓存不一致)是两个不同的问题. volatile关键字太强,即阻 ...

  10. java指令重排案例

    /*** 验证指令重排的案例* 顺序执行下,x和y不可能同时为0,如果出现了同时为0,则说明发生了指令重排.*/ public class InstructionRearrangement {stat ...

最新文章

  1. sqlhelper使用指南
  2. 训练MNIST数据集模型
  3. C++ Primer 5th笔记(chap 13 拷贝控制)移动构造和移动赋值
  4. 部署和调优 1.5 vsftp部署和优化-1
  5. 用两个使用Caffe的小项目案例演示迁移学习的实用性
  6. The Pilots Brothers' refrigerator
  7. linux python源码目录结构,TensorFlow0.8源码阅读 -- 代码目录结构讲解
  8. php 添加样式,添加样式到php html电子邮件
  9. 王道考研 计算机网络6 OSI参考模型和各层作用
  10. 求职简历介绍html5模板
  11. 参数调整 新部署rac_CDH5部署三部曲之三:问题总结
  12. 如何提高NLP模型鲁棒性和泛化能力?对抗训练论文串讲
  13. 用Java写一个浪费cpu的程序_Java程序是如何浪费内存的
  14. 城市规划图例符号_城市规划图例符号
  15. 清华学生的编程能力有多强?大一学生 C++作业引爆全网,特奖得主、阿里P6:我们也做不到...
  16. html写一个3d地球特效,html5 canvas+three.js绘制3D地球自转动画特效
  17. 使用pip报错error: Microsoft Visual C++ 14.0 is required. Get it with “Microsoft Visual C++ Build Tools“:
  18. 算法设计与分析: 3-4 多重幂计数问题
  19. 合唱队形java_合唱队形
  20. 【历史上的今天】4 月 3 日:亚马逊卖出第一本书;世界上第一通手机电话;IBM 计算机先驱出生

热门文章

  1. MySQL按天统计一周没有数据补0
  2. 转行数据分析师一定需要考证吗?1分钟告诉你答案
  3. 浅谈最近流行的三起区块链51%算力攻击
  4. 无法将为“Microsoft.Office.Interop.Word.ApplicationClass”的 COM 对象强制转换为接口类型
  5. linux 对称加密命令,linux安全和加密篇(三)—openssl工具和CA证书
  6. Delphi 中资源文件使用详解
  7. 首批小程序出炉,小游戏?
  8. hadoop+Kylin服务器搭建教程
  9. SpringBoot Thymeleaf Vue Mybatis 登录和注册的实现,以及使用Cookie实现七天免登录
  10. python使用Canny算法和HoughCiecle算法实现圆的检测与定位