因为程序执行都在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中也存在该变量的副本,因为其他线程可能对这个值进行了操作,那么在写数据前,它就会从内存重新在读取一次。
可见性:
可见性是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。