voliate关键字学习
特性一:保证可见性
从硬件层次了解可见性
由于CPU速度和内存速度的差异性,产生了高速缓存cache。有了高速缓存后,CPU处理过程是将需要的内存数据读入缓存,当CPU进行计算时,直接读取高速缓存。在运算完成后,将结果同步到内存中。在多CPU环境中,由于每个线程运行在不同的CPU中,并且每个线程有自己独立的缓存。同一份数据被缓存到多个CPU中,如果不同CPU中缓存的同一份内存值不同,就会导致缓存不一致问题。
由此产生了缓存一致性协议:当CPU写数据时,如果发现操作的变量是共享变量,即在其他CPU中也存在该变量的副本,就会发出信号通知其他CPU,同时其他CPU会在总线上通过嗅探检查自己的缓存是否过期,如果过期将该变量的缓存设置为无效状态。当其他CPU读取这个值的时候,发现是无效状态,就会去内存中重新读取。因此voliate的缓存一致性协议可以保证可见性。
特性二:禁止指令重排
重排序是编译器或者处理器为了优化程序性能而对程序重新排序的一种手段。
voliate会在生成指令序列的合适位置插入内存屏障来禁止指令重排。
特性三:不保证原子性
由于共享变量可见性,各线程在修改共享变量时会通知其他线程将共享变量的值设置为无效,但由于多线程竞争调度,1号线程刚要写入内存就被挂起,2号线程将值写入内存后通知其他线程,由于线程操作极快,还没来得及通知其他线程刚刚挂起的1号线程将值再次写入内存,主内存的值被覆盖,出现丢失写值。
---------------------------------------------------------------------