高并发编程 volatile 和 加锁 解决缓存不一致

因为程序执行都在cpu中,但是如果没有高速缓存,cpu大部分的时间都用来了读取内存的数据。

从而Cpu有 高速缓存,在运行指令前,会把相关需要的数据提前拷贝到cpu,运算完成后在刷回内存里。

 

高速缓存主要提前缓存数据到cpu,等cpu运算完成后把结果返回给主存

 

I = 0

比如 i = i+1 

就会 先把 i = 0 复制到高速缓存中,这样cpu进行加1 操作后,在把值还给主存 得到 i =1

 

当高并发编程时候

i = i +1  

线程1 计算完 i = 1 ,但是没有来得及写入主存

线程2 就还是取到i = 0,导致最终i自增两次后还是等于1

 

 

这样就出现了 缓存不一致的问题

一般两种解决方案

 

1 执行的块 加锁 (只能一个线程去访问)

2 通过缓存一致性协议

 

但是加锁导致了,这段代码不能并发,效率低下

 

所以就要能支持并发的缓存一致性协议:

核心思想就是:当CPU写数据时,如果发现操作的变量是共享变量,即在其他CPU中也存在该变量的副本,因为其他线程可能对这个值进行了操作,那么在写数据前,它就会从内存重新在读取一次。

 

可见性:

可见性是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值