JVM 之volatile关键字重排序

计算机在执行程序时。为了提供性能,编译器和处理器的常常会对指令做重排,
源代码--->编译器优化的重排--->指令并行的重排--->内存系统的重排--->最终执行的指令

一般分以下3种

1.单线程里面确保程序最终执行结果和代码顺讯执行的结果一致。

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

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

volatile实现禁止指令重排优化,从而避免多线程环境下程序出现乱序执行的现象,

先了解一个概念,内存屏障(Memory Barrier) 又称内存栅栏,是一个CPU指令,它的作用有两个;

一是保证特定操作的顺序执行,

二是保证某些变量的内存可见性(利用该特性实现volatile的内存可见性)。

由于编译器和处理器都执行指令重排优化,如果指令间插入一条Memory Barrier则会告诉编译器和CPU,不管什么指令都不能用强制刷出各种CPU的缓存数据,因此任何CPU上的线程都能读取到这些数据的最新版。

DCL(双端检锁)机制不一定线程安全,原因是指令重排序的存在,加入volatile可以禁止指令重排

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容