Volatile 原理五:禁止指令重排是什么?
大家好,我是悟空。
说到指令重排就得知道为什么要重排,有哪几种重排。
如下图所示,指令执行顺序是按照 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
版权声明: 本文为 InfoQ 作者【悟空聊架构】的原创文章。
原文链接:【http://xie.infoq.cn/article/f831dd5e46b762090fe777043】。未经作者许可,禁止转载。
评论