zoukankan      html  css  js  c++  java
  • JVM学习(八)指令重排序

    一、数据依赖性

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

     

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

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

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

    二、相关规则

    as if serial语义

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

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

    happen-before原则

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

    程序次序规则

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

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

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

     

  • 相关阅读:
    STM32低功耗模式与烟雾报警器触发信号电路设计
    cocos2d-x的环境的搭建
    window8.1中用户的管理员权限的提升方法
    cmd中目录的变更
    js的传值,table中tr的遍历,js中动态创建数组
    究竟什么是游戏引擎?
    大型网站架构学习心德
    关于listView 中的聚焦问题
    android6.0 适配的问题——activity销毁的问题
    文件发送成功率低的问题(2)
  • 原文地址:https://www.cnblogs.com/riches/p/13279903.html
Copyright © 2011-2022 走看看