高并发编程 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中也存在该变量的副本,因为其他线程可能对这个值进行了操作,那么在写数据前,它就会从内存重新在读取一次。

可见性:

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

猜你喜欢

转载自blog.csdn.net/xmh594603296/article/details/81605716