volatile和内存屏障

什么是内存屏障?

当多个线程访问同一个数据,内存屏障可以保证数据可见性和有序性。可以禁止指令重排序。因为cpu对内存的访问是乱序的,如果发生了指令重排序,可能会导致不同的结果。所以需要一个内存屏障,保证内存屏障前后的指令的有序性,可以确保屏障之前的读写操作,都提交到内存之后,再执行屏障后的读写操作

从操作系统硬件的层面而言:

cpu高速缓存

线程是cpu调度的最小单元,cpu在处理运算时候,还需要与内存交互,比如读取内存数据,存储运算结果,这个IO是很难消除,计算机为了加速读写速度,就在cpu和内存之间增加了一个高速缓存,将需要使用到数据加入到高速缓存中,运算结束再从缓存同步到内存中。但是在多线程模式下,每个线程在不同的cpu上运行,每个线程就有着不同高速缓存,这时候就需要保证缓存的一致性。

在这里插入图片描述

加入内存屏障就是为了保证,确保屏障之前的数据读写操作,都提交到内存之后,再执行屏障后的读写操作,保证了数据可见性,防止指令重排序。
写屏障保证了在屏障之前的操作会强制更新到主内存,对其他线程是可见的,这种显示调用防止了指令重排序
读屏障可以让高速缓存中的数据失效,强制从主内存中加载数据,避免缓存不一样

volatile

而加入的volatile关键字就相当于实现了一种内存屏障(全屏障,包含读写屏障)。编译器会在volatile字段的读写操作前后,加入内存屏障,当数据更新时,确保数据刷新到内存。 被volatile修饰的变量,写操作一定会发生在读操作之前,也即保证读的数据是最新的。

java内存模型底层实现可以简单的认为:通过内存屏障禁止指令重排序。而volatile操作就相当于是内存屏障

volatile的happen-before原则: 对一个volatile变量的写操作happen-before对此变量的任意操作。
对 volatile 变量的写操作的结果对于发生于其后的任何操作的结果都是可见的。x86 架构下volatile 通过内存屏障和缓存一致性协议实现了变量在多核心之间的一致性。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EmineWang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值