写点什么

Volatile 原理五:禁止指令重排是什么?

作者:悟空聊架构
  • 2021 年 12 月 13 日
  • 本文字数:588 字

    阅读完需:约 2 分钟

大家好,我是悟空。


说到指令重排就得知道为什么要重排,有哪几种重排。


如下图所示,指令执行顺序是按照 1>2>3>4 的顺序,经过重排后,执行顺序更新为指令 3->4->2->1。



会不会感觉到重排把指令顺序都打乱了,这样好吗?


可以回想下小学时候的数学题:2+3-5=?,如果把运算顺序改为3-5+2=?,结果也是一样的。所以指令重排是要保证单线程下程序结果不变的情况下做重排。

为什么要重排

计算机在执行程序时,为了提高性能,编译器和处理器常常会对指令做重排序。

有哪几种重排

  • 1.编译器优化重排:编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。

  • 2.指令级的并行重排:现代处理器采用了指令级并行技术来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。

  • 3.内存系统的重排:由于处理器使用缓存和读/写缓冲区,这使得加载和存储操作看上去可能是在乱序执行。



注意:


  • 单线程环境里面确保最终执行结果和代码顺序的结果一致

  • 处理器在进行重排序时,必须要考虑指令之间的数据依赖性

  • 多线程环境中线程交替执行,由于编译器优化重排的存在,两个线程中使用的变量能否保证一致性是无法确定的,结果无法预测。

作者简介:悟空,8 年一线互联网开发和架构经验,用故事讲解分布式、架构设计、Java 核心技术。《JVM 性能优化实战》专栏作者,开源了《Spring Cloud 实战 PassJava》项目,公众号:悟空聊架构。本文已收录至 www.passjava.cn

发布于: 18 小时前阅读数: 6
用户头像

用故事、大白话讲解Java、分布式、架构设计 2018.05.06 加入

公众号:「悟空聊架构」 【个人博客】www.passjava.cn 【开源项目】基于 SpringCloud 的一套面试刷题系统 【Github】https://github.com/Jackson0714/PassJava-Platform

评论

发布
暂无评论
Volatile 原理五:禁止指令重排是什么?