##volatile介绍

​ volatile英文含义为易变的,作为Java的一个最重要的关键字,没有之一,有人会说最重要的关键字是class,233。基本上需要线程安全的地方都会有它的出现。如比较常见的AQS(AbstractQueuedSynchronizer)中的state就被声明为volatile。

​ Java语言规范(Java8)的定义:

volatile Fields: A field may be declared volatile, in which case the Java Memory Model ensures

that all threads see a consistent value for the variable .

​ 大概意思就是说,Java内存模型可以保证共享变量(volatile)的多线程可见性,如果一个线程修改了共享变量,其他线程能够读取到修改值。

volatile的实现

​ 在对volatile锁修饰变量进行写入时,Jvm模板解释器除了生成正常的汇编指令外,还会额外生成一个lock指令。lock会将当前cpu的缓存行数据回写到系统内存,此外还会使得其他cpu的该数据地址无效,其实就是MESI控制协议所起的作用,这个协议可以保证所有处理器和内存中存储的数据是一致的。

MESI(Modified Exclusive Shared Or Invalid) CPU缓存一致性协议

2017.10.08 看了Inter cpu开发手册,发现说得不清楚,先不写。

2018.1.02 调试了jvm10的模板解释器,生成的东西太多,未搞懂。

2018.1.08 找到了一份国外MESIF文档,居然说的是i7处理器,读之,卒。