对于volatile的理解

对于volatile(线程间可见)的理解

volatile关键字
可以实现线程中的数据通信。
系统有三段缓存 分为L1,L2,L3
L1,L2是各个线程私有的,而L3是大家共有的。

一个线程拥有的

每当一个线程出现cpu都会为其开辟一份空间,其中就包含了L1,L2缓存块。所以我们也可以知道:线程是cpu执行的基本单位

这两个缓存块中会单独存储线程获取到的数据副本。比如线程a和线程b同样获取到了变量i,当a,b去改变i时,其实改变的是一个副本:存储在缓存块中的数据。两者是不互通的。

而volatile是怎么改变这种状况的呢?

其实是做了一种修改后使其他副本失效的功能。
当a改变了它存储的i副本后,会立马向程序写回i的变化,而b中存储的副本会立即失效。只能选择再次读取i的信息。

这样也会造成一些问题,比如变量i ,变量j 用volatile修饰,被a,b两个线程单独使用,但是双方都被加载到了双方的缓存块中,a单独对i修改,i被修改后,b操作j的时候仍需要对i进行再次读取,这影响了代码的效率。说到这里不得不说一下:计算机每次在读取数据的时候都是按块读取一般是64字节。当i,j都在这64字节中时就会发生上述的问题。那么大家也应该知道该怎么解决这个问题了。就是让i,j不要同时存在于这个块中。具体操作就是在i和j之间添加足够量的数据(缓存行对齐)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值