volatile的实现原理

volatile关键字的作用

volatile是轻量级的synchronized,用于保证共享变量在多线程中的可见性,即一个线程修改了volatile标记的值的时候,另外一个线程可以读到这个值,但是要注意,volatile不能保证复合操作的原子性

cpu的一些术语

一般状况下的线程读写操作

cpu为了提高处理速度,不会直接与内存进行通信,而是现将内存中的数据读取到线程内部缓存后在进行操作,这就造成了当多线程对共享变量进行操作的时候,就会造成修改过的值没有办法即时更新,出现并发问题

cpu如何保证volatile的可见性(多核处理器情况下)

添加了volatile关键字的共享变量在进行写操作的时候会比平常的变量多出来一个Lock前缀指令,这个指令主要就是做了两件事情

  1. 将当前处理器缓存的数据写回到系统缓存
  2. 是其他cpu中缓存了该内存地址的数据无效

volatile的具体实现(在多核处理器情况下从读和写两个方面分析)

  • 写操作:在Lock前缀指令引起处理器将缓存写回到内存的时候,会确保在声言该信号的时间内,处理器可以独占共享内存,也就是锁总线,这样其他的cpu就不能进行访问访问系统内存,在一些处理器中,Lock锁定的不是总线,而是锁缓存(MESI控制协议),究其原因,锁总线的开销要比锁缓存要大,因为锁总线其他cpu都要阻塞
  • 读操作:处理器通过MESI控制协议维护内部缓存和其他处理器的缓存一致性,处理器通过嗅探在总线上传播的数据来看检查自己缓存的值是不是过期了,也就是看自己缓存对应的内存地址有没有被修改,如果发现被修改,就将当前处理器的缓存行设置为无效状态,当要对这个数据进行修改的时候,吧数据重新从内存中读入

volatile的使用场景

  • 对变量的写操作不依赖于当前值
  • 该变量没有包含在具有其他变量的不变式中
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值