在《java并发编程的艺术》这本书中,关于volatile的内存原理本质的描述如下:
有volatile变量修饰共享变量在编译器编译后,后多出一个“lock” 来(lock前缀指令相当于一个内存屏障,会强制将对缓存的修改操作写入主内存),该字符在多核处理器下回引发两个事件:
1.将当前处理器缓存行的数据写回系统内存;
2.这个写会内存的操作会使得其他处理器里缓存的该内存地址的数据无效。
在该书籍第三章中的描述如下:
1.当写一个volatile变量时,JMM(java共享内存模型)会把该线程对应的本地内存中的共享变量值刷新到主内存;
2.当读一个volatile变量时,JMM会把该线程对应的本地内存置为无效,线程接下来从主内存中读取共享变量。
在第三章中并未深入讲述JMM时如何将该线程对应的本地内存置为无效的,在第二章中,也只是一笔带过有如下描述:
1.每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是不是过期了,当处理器发现自己缓存行对应的内存地址被修改,就会将当前处理器的缓存行设置为无效状态, 当处理器对这个数据进行修改操作的时候,会重新从系统内存中吧数据读到处理器缓存行里。
2.处理器使用嗅探技术保证它的内部缓存,系统内存和其他处理器的缓存在总线上保持一致。
书中并没有明确说明,处理器将会在何时触发“嗅探”这个操作,但我在基于书本做出以下猜测:
volatile修饰的共享变量的写操作会触发“嗅探”,让处理器本地缓存中的volatile变量失效;
然而,什么事嗅探技术以及其实现原理,暂时没有任何的思绪,在网上一翻查找也没有满意的答案,或许在以后的学习书籍清单中会给自己解惑(支持处理器的技术)。