Volatile实现原理

Volatile是轻量级的synchronized,在多处理器开发中保证了“共享变量”的可见性。Volatile如果得到合适的使用,可以比synchronized执行成本更低,因为它不会引起线程上下文的切换和调度。那么Volatile是如何保证可见性的呢?

在汇编代码中,Volatile修饰的共享变量进行写操作时,会多一条**#Lock**前缀的指令。该指令在多核处理器下会影响两件事情:

  • 将当前处理器缓存行的数据会写回到系统内存。
  • 这个写回内存的操作会引起在其他CPU里缓存了该内存地址的数据无效。

我们知道,处理器为了提高处理速度,不直接和内存进行通讯,而是先将系统内存的数据读到内部缓存(L1,L2或其他)后再进行操作。那么,处理器完成第一件事情后是如何做到第二件事的呢。这就引出了缓存一致性协议。处理器会通过嗅探检测是否有处理器写内存地址,如果有,那么当前处理器会无效掉自己的缓存行;也就是说,一个处理器修改自己缓存的共享变量后,会回写到内存中,并让其他处理器的相应缓存无效。其他处理器如果要修改,就必须再执行一次缓存行填充。如上通过Volatile就保证了java线程内存模型所有线程看到共享变量的值是一致的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值