一、数据依赖性

  在学习JVM的指令重排序之前,我们先了解一下什么是数据依赖性:

  编译器和处理器在处理具体的指令时,可能会对操作进行重排序来提高执行性能【多条指令并行执行,所以提升性能的同时也可能会导致指令乱序;而上面3种情况,只要重排序两个操作的执行顺序,程序的执行结果就会被改变。

  编译器和处理器在重排序时,会遵守数据依赖性,编译器和处理器不会改变存在数据依赖关系的两个操作的执行顺序。

  PS:这里所说的数据依赖性仅针对单个处理器中执行的指令序列和单个线程中执行的操作,不同处理器之间和不同线程之间的数据依赖性不被编译器和处理器考虑。

二、相关规则

as if serial语义

  义:不管怎么重排序(编译器和处理器为了提高并行度),(单线程)程序的执行结果不会改变。

  解析:编译器、runtime和处理器都必须遵守as-if-serial语义。 为了遵守as-if-serial语义,编译器和处理器不会对存在数据依赖关系的操作做重排序,因为这种重排序会改变执行结果。 但是,如果操作之间不存在数据依赖关系,这些操作就可能被编译器和处理器重排序。

happen-before原则

  定义:一个线程中的每一个操作happens-before于该线程的任意后续操作,这里的happens-before并不是前一个操作必须早于后一个操作, 而是前一个操作必须对后一个操作可见,否则不能重排序。

程序次序规则

  定义:一段程序代码的执行在单个线程中看起来是有序的,不过因为虚拟机可能会对程序代码进行指令重排序,虽然进行重排序,但是最终执行的结果是与程序顺序执行的结果一致的。

三、重排序对多线程的影响

  我们前面知道了,在单线程运行中,指令重排序不能影响程序执行的结果,但是在多线程的运行中,指令重排序可能会影响程序的执行结果的,我们通过一张图来直观地观察一下:

最新文章

  1. NOIP2009多项式输出(水)【A004】
  2. Linux学习笔记18--Linux系统服务基础
  3. android AccessibltyService 辅助服务
  4. webService 部署以后参数输入框不能显示
  5. jquery取checkbox选中的值
  6. hadoop-2.7.0
  7. jsp标准标签库
  8. WPF以Clickonce方式发布后使用管理员身份运行
  9. POJ 1269 (直线相交) Intersecting Lines
  10. 深入理解JAVA多态原理
  11. spring boot web相关配置
  12. ym——Android开发编码规范(自用)
  13. linux和android开发链接
  14. linux系统安装mysql
  15. 2018申请淘宝客AppKey
  16. 2293: Distribution Center 中南多校
  17. 【Java】【问题】
  18. codeforces 741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths
  19. SpringBoot与Web开发
  20. 转:C# 读取EXCEL文件的三种经典方法

热门文章

  1. 客户端操作 2 HDFS的API操作 3 HDFS的I/O流操作
  2. 区块链入门到实战(38)之Solidity – 条件语句
  3. java23种设计模式——三、工厂模式
  4. Java面试题 200+
  5. FlashFXP免费版下载
  6. idea创建web项目,不能自动导入tomcat包,导致调用request的方法时,无法正常调用
  7. 3个必备cookie实用方法
  8. 3种 Springboot 全局时间格式化方式,别再写重复代码了
  9. Sql 注入----学习笔记
  10. springboot AOP实战