Volatile如何保证可见性

volatile是java虚拟机提供的轻量级的同步机制,能够保证内存共享变量的可见性。那么volatile是如何保证可见性的呢?

首先要知道内存屏障是什么,
内存屏障是一个CPU指令,内存屏障是这样的指令
1,确保特定操作执行的顺序
2,影响一些数据的可见性,编译器和CPU可以保证输出结果一样的前提下对指令进行重排序,使得性能优化,当插入一个内存屏障,相当于告诉CPU和编译器,先于这个命令的必须先执行,后于这个命令的必须后执行
3,强制更新一次不同的CPU缓存,比如一个写屏障会把这个屏障前写入的数据刷新到缓存,任何师徒读取改数据的线程将得到最新的值

系统提供的内存屏障:

LoadLoad屏障
对于Load1; LoadLoad; Load2 ,操作系统保证在Load2及后续的读操作读取之前,Load1已经读取。
StoreStore屏障
对于Store1; StoreStore; Store2 ,操作系统保证在Store2及后续的写操作写入之前,Store1已经写入。
LoadStore屏障
对于Load1; LoadStore; Store2,操作系统保证在Store2及后续写入操作执行前,Load1已经读取。
StoreLoad屏障
对于Store1; StoreLoad; Load2 ,操作系统保证在Load2及后续读取操作执行前,Store1已经写入,开销较大,但是同时具备其他三种屏障的效果。
此处见原博客:内存屏障和volatile

Volatile和内存屏障:

volatile修饰的变量,JMM将在写操作后插入一个写屏障指令,在读操作前插入一个读屏障指令,这代表着:
1,一旦有现成对变量写入了新值,任何访问这个变量的线程都会得到新的值
2,在写入前,也会保证所有之前发生的事情已经发生,并且更新过的数据值也是可见的。内存屏障会把之前的写入值都刷新到缓存
所以Volatile可以保证可见性

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值