| 
          
         | 
         
          
          
              volatile变量自身具有下列特性:-    可见性。对一个volatile变量的读,总是能看到(任意线程)对这个volatile变量最后的写入。
 -    原子性:对任意单个volatile变量的读/写具有原子性,但类似于volatile++这种复合操作不具有原子性。
    其实现原理为: 
 
      1,通过插入内存屏障指令禁止编译器和CPU对程序进行重排序。 
 
      2,当对声明了volatile的变量进行写操作时,JVM就会向处理器发送一条Lock前缀的指令,这条Lock前缀指令产生如下两个作用: 
 
          1)Lock前缀指令会引起处理器缓存回写到系统内存,并使用缓存一致性机制来确保回写的原子性。 
 
          2)一个处理器的缓存回写到系统内存会导致其他处理器的缓存无效。处理器使用MESI控制协议去维护内部缓存和其他处理器缓存的一致性。处理器能嗅探其他处理器访问系统内存和它们的内部缓存。处理器使用嗅探技术保证它的内部缓存、系统内存和其他处理器的缓存的数据在总线上保持一致。例如,在Pentium和P6 family处理器中,如果通过嗅探一个处理器来检测其他处理器打算写内存地址,而这个地址当前处于共享状态,那么正在嗅探的处理器将使它的缓存行无效,在下次访问相同内存地址时,强制执行缓存行填充。 
 
             				 
													 
---------------------------- 
原文链接:https://blog.51cto.com/wenshengzhu/2056138 
 
程序猿的技术大观园:www.javathinker.net 
 
 
          
          
          
            
  
            [这个贴子最后由 flybird 在 2020-03-23 17:42:08 重新编辑]
          
          
         | 
        
      
 
          |