【面试题】volatile底层是如何基于内存屏障保证可见性和有序性的?

本文探讨volatile关键字在Java中的底层原理,如何保证可见性和有序性。通过内存屏障防止指令重排,并结合MESI缓存一致性协议,确保数据同步。面试中,volatile的原子性、内存模型及实现细节是常见问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

volatile底层原理,如何实现保证可见性的呢?如何实现保证有序性的呢?

volatile+原子性:不能保证原子性,虽说有些极端特殊的情况下有保证原子性的效果

极端场景:oracle、64位的long的数字进行操作时

【面试题】问volatile底层、java内存模型、问volatile是如何保证可见性的,缓存一致性协议,追问,volatile之后,具体是发送了什么指令去实现什么效果?

(1)#lock前缀指令(记住)、嗅探机制

MESI缓存一致性协议

对volatile修饰的变量,执行写操作的话,JVM会发送一条lock前缀指令给CPU,CPU在计算完成后会立即将这个值写回主内存,同时因为有MESI缓存一致性协议,所以各个CPU都会对总线进行嗅探,自己本地缓存中的数据是否被别人修改。

如果发现别人修改了某个缓存的数据,那么CPU会将自己本地缓存的数据过期掉,然后这个CPU上执行的线程在读取那个变量的时候,就会从主内存中重新加载最新的数据。

#lock前缀指令+MESI缓存一致性协议

(2)内存屏障:禁止指令重排

屏障类别:

  • 每个volatile写操作前面,加StoreStore屏障,禁止上面的普通写和他重排
  • 每个volatile写操作后面,加StoreLoad屏障,禁止和下面的volatile读、写重排
  • 每个volatile读操作前面,加LoadLoad屏障,禁止上面的普通读和volatile读重排
  • 每个volatile读操作后面,加LoadStore屏障,禁止下面的普
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值