如果一个字段被声明为volatile,Java线程内存模型确保所有线程看到的这个变量的值是一致的。
当cpu写数据时,如果发现操作的变量是共享变量,即在其他cpu中也存在该变量副本,会发出信号通知其他cpu将该变量的缓存行置为无效状态,因此当其他cpu需要读取这个变量时,会重新去内存中读取。
问题:volatile会一直嗅探cas不断循环导致带宽达到峰值(总线风暴)
被volatile修饰的变量进行写操作的时候会多出一行汇编代码“lock addl $0x0,(%esp);”,lock前缀的指令在多核处理器下会引发两件事情:

  1. 将当前处理器缓存行的数据写会到系统内存
  2. 这个写回内存的操作会使其他CPU里缓存了该内存地址的数据无效