关于volatile的底层原理的一些补充

描述下场景:一个main方法中有2个线程,initFlag是布尔类型的共享变量。一个线程是对initFlag作取反的死循环,一旦initFlag为true就跳出死循环,执行打印success的操做;另外一个线程修改initFlag为true,触发第一个线程跳出死循环。第一个线程启动以后sleep下确保在启动第二个线程时第一个已经进入死循环。缓存

图中有一个主内存区,2个线程,每一个线程有本身的工做内存,线程启动以后会从主内存中读取变量的副本存在工做内存中,经过read指令读取、load指令载入工做内存。第二个线程会对initFlag取反操做,经过use指令读取工做内存的变量,经过assign指令进行计算,把计算的新值赋值给工做内存的变量赋值。如果共享变量是volatile声明的,就会把新值当即回写到主内存,经过store指令读取工做内存的变量传入到主内存,而后在主内存中经过write指令给变量赋值。线程

回写时底层经过lock前缀指令执行锁定这块内存区域的缓存(缓存行锁定),而后执行store指令,这里须要注意的是全部的读写请求都经过总线,由总线传递给全部的CPU。其余CPU经过总线嗅探和缓存一致性协议来保证数据的一致性。具体是由每一个CPU经过总线嗅探机制会监听本身工做内存中存在的变量,一旦发生回写,缓存一致性协议会使得其余CPU里缓存了改内存地址的数据无效,当其余CPU须要回写或者使用时会从新从内存中读取。在回写到主内存完成以后会执行unlock指令,提供给其余CPU使用。简单的说就是全部的读写请求都经过总线传递给全部的CPU,而后CPU去“嗅探”这些请求,当感知到数据变化时将本身的缓存的数据置为失效。blog

相关文章
相关标签/搜索