java指令重排,为什么重排?
指令重排序是指编译器或CPU为了优化程序的执行性能而对指令进行重新排序的一种手段,重排序会带来可见性问题,所以在多线程开发中必须要关注并规避重排序。
从源代码到最终运行的指令,会经过如下两个阶段的重排序。
第一阶段,编译器重排序,就是在编译过程中,编译器根据上下文分析对指令进行重排序,目的是减少CPU和内存的交互,重排序之后尽可能保证CPU从寄存器或缓存行中读取数据。
在前面分析JIT优化中提到的循环表达式外提(Loop Expression Hoisting)就是编译器层面的重排序,从CPU层面来说,避免了处理器每次都去内存中加载stop,减少了处理器和内存的交互开销。
第二阶段,处理器重排序,处理器重排序分为两个部分。
并行指令集(CPU)重排序,这是处理器优化的一种,处理器可以改变指令的执行顺序。
内存系统“重排序”,这是处理器引入Store Buffer缓冲区延时写入产生的指令执行顺序不一致的问题;内存系统内不存在真正的重排序,但是内存会带来看上去和重排序一样的效果。
由于内存有缓存的存在,在 JMM 里表现为主存和本地内存,而主存和本地内存的内容可能不一致,所以这也会导致程序表现出乱序的行为。
JMM结构:抽象了线程和主内存之间的关系,就比如说线程之间的共享变量必须存储在主内存中
- 主内存 :所有线程创建的实例对象都存放在主内存中,不管该实例对象是成员变量还是方法中的本地变量(也称局部变量)
- 本地内存 :每个线程都有一个私有的本地内存来存储共享变量的副本,并且,每个线程只能访问自己的本地内存,无法访问其他线程的本地内存。本地内存是 JMM 抽象出来的一个概念,存储了主内存中的共享变量副本。
java指令重排,为什么重排?相关推荐
- BeanShell中的Java指令和表达式
我的博客原址:点击此处 BeanShell 能够理解标准的 Java 指令,表达式和方法的语法.那些指令和表达式都是在一个 Java 方法中你会提到的非常常见的东西,像变量的定义和分配,方法调用,循环 ...
- java 指令重拍_我发现我的Java重拍了!
java 指令重拍 在一月份,我写了一篇文章,介绍了一些我希望在Java语言中看到的变化,这些变化会让我更加喜欢它(并使它变得更现代). 很多人建议使用许多JVM语言,但我很大程度上不予理会,因为这不 ...
- java指令和javac指令总结
假如在D:\Java存放了两个java源文件:MyJava.java,Fighting.java MyJava.java如下: public class MyJava { public static ...
- c如何接收java指令_java指令和javac指令总结
假如在D:\Java存放了两个java源文件:MyJava.java,Fighting.java MyJava.java如下: public class MyJava { public static ...
- JVM:Java指令源码opcode
JVM:Java指令源码opcode 关键词 Java 字节码是沟通 JVM 与 Java 程序的桥梁 指令( opcode)由操作码和操作数组成 JVM 翻译字节码( 将 opcode + 操作数翻 ...
- java菜鸟2:java指令
java指令 http://download.csdn.net/detail/jji8877032/9152033 反编译 javap -verbose xxx.class
- Java 指令与字节码
Java 指令与字节码 查看class文件 编写简单java代码 编译代码 查看class文件 Java字节码总的结构表 常量池 常量池容量计数器 字面量和符号引用 全限定名 简单名称 描述符 常量类 ...
- Java指令-Djava.ext.dirs的陷阱
Java指令-Djava.ext.dirs的陷阱 https://blog.csdn.net/cyony/article/details/74375251 这两天由于现场需求,需要把ES索引写入插件改 ...
- 一篇讲Java指令重排和内存可见性的好文
在这里: http://tech.meituan.com/java-memory-reordering.html 指令重排和内存可见性(缓存不一致)是两个不同的问题. volatile关键字太强,即阻 ...
- java指令重排案例
/*** 验证指令重排的案例* 顺序执行下,x和y不可能同时为0,如果出现了同时为0,则说明发生了指令重排.*/ public class InstructionRearrangement {stat ...
最新文章
- sqlhelper使用指南
- 训练MNIST数据集模型
- C++ Primer 5th笔记(chap 13 拷贝控制)移动构造和移动赋值
- 部署和调优 1.5 vsftp部署和优化-1
- 用两个使用Caffe的小项目案例演示迁移学习的实用性
- The Pilots Brothers' refrigerator
- linux python源码目录结构,TensorFlow0.8源码阅读 -- 代码目录结构讲解
- php 添加样式,添加样式到php html电子邮件
- 王道考研 计算机网络6 OSI参考模型和各层作用
- 求职简历介绍html5模板
- 参数调整 新部署rac_CDH5部署三部曲之三:问题总结
- 如何提高NLP模型鲁棒性和泛化能力?对抗训练论文串讲
- 用Java写一个浪费cpu的程序_Java程序是如何浪费内存的
- 城市规划图例符号_城市规划图例符号
- 清华学生的编程能力有多强?大一学生 C++作业引爆全网,特奖得主、阿里P6:我们也做不到...
- html写一个3d地球特效,html5 canvas+three.js绘制3D地球自转动画特效
- 使用pip报错error: Microsoft Visual C++ 14.0 is required. Get it with “Microsoft Visual C++ Build Tools“:
- 算法设计与分析: 3-4 多重幂计数问题
- 合唱队形java_合唱队形
- 【历史上的今天】4 月 3 日:亚马逊卖出第一本书;世界上第一通手机电话;IBM 计算机先驱出生
热门文章
- MySQL按天统计一周没有数据补0
- 转行数据分析师一定需要考证吗?1分钟告诉你答案
- 浅谈最近流行的三起区块链51%算力攻击
- 无法将为“Microsoft.Office.Interop.Word.ApplicationClass”的 COM 对象强制转换为接口类型
- linux 对称加密命令,linux安全和加密篇(三)—openssl工具和CA证书
- Delphi 中资源文件使用详解
- 首批小程序出炉,小游戏?
- hadoop+Kylin服务器搭建教程
- SpringBoot Thymeleaf Vue Mybatis 登录和注册的实现,以及使用Cookie实现七天免登录
- python使用Canny算法和HoughCiecle算法实现圆的检测与定位