volatile:可见性指的是当一个线程修改了某个共享变量
的值,其他线程是否能够马上得知这个修改的值。对于串行程序来说,可见性是不存在的,
因为我们在任何一个操作中修改了某个变量的值,后续的操作中都能读取这个变量值,并且
是修改过的新值。
多核多线程下volatile关键字特点:
1、是一种轻量级锁
2、保证被volatile修饰的变量能被所有线程可见的
3、禁止指令重排序,保证有序性
4、不支持原子性
/*
在CPU多核处理器下,为了保证各个处理器的缓存是一致的,就会实现缓存一致性协议,每个CPU CORE通过嗅探机制在总线上传播的数据来检查自己缓存的值是不是过期了,当处理器发现自己缓存行对应的内存地址被修改,就会将当前处理器的缓存行设置成无效状态,当处理器对这个数据进行修改操作的时候,会重新从系统内存中把数据读到处理器缓存里。
*/
可见性原理通过如下的例子说明:
如volatile修饰共享变量flag,在汇编语言级别flag变量会带有lock前缀指令。当其中一个CPU CORE修改缓存中的flag变量后,如果发现其带有lock前缀指令,这时CPU会马上发起lock操作,锁定主内存中的flag变量,并将新的值回写主内存,然后unlock。在回写到主内存过程中,如果缓存一致性协议是开启的,那么在回写数据在通过总线时,CPU通过嗅探机制会感知的共享变量flag发生了改变,就会把工作内存(即缓存)中的共享变量副本做失效处理。待主内存的值修改完unlock后,CPU在重新读取新的值到工作内存。
高速缓存一致性协议(MESI):也称缓存一致性,是指在采用层次结构存储系统的计算机系统中,保证高速缓冲存储器中数据与主存储器中数据相同机制。在一个系统中,当许多不同的设备共享一个共同存储器资源,在高速缓存中的数据不一致,就会产生问题。
lock指令作用
1、将当前处理器缓存行中的数据立即写回主内存
2、数据写会主内存的过程中,CPU通过嗅探机制感知到,带有lock前缀指令的数据发生变化,会使其它CPU缓存的此数据失效。
原文:https://www.cnblogs.com/landiss/p/14184306.html