美文网首页Java 杂谈
JVM 之volatile关键字重排序

JVM 之volatile关键字重排序

作者: 周小鑫001 | 来源:发表于2019-07-05 16:10 被阅读4次

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

    一般分以下3种

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

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

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

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

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

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

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

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

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

    相关文章

      网友评论

        本文标题:JVM 之volatile关键字重排序

        本文链接:https://www.haomeiwen.com/subject/hclehctx.html