volatile可以视为是对JMM的部分实现,它解决了可见性和有序性的问题
它指定了让JVM发送禁止缓存,禁止重排序的指令
具体实现主要是编译成class文件时会设置ACC_VOLATILE访问标识,
在volatile操作指令之间插入相应的LoadLoad ,LoadStore,StoreLoad,StoreStore等jvm层面的内存屏障指令,
当jvm翻译到这些指令的时候就会调用操作系统相应的函数lock,
从而让cpu底层通过内存屏障,MESI缓存一致性协议等机制来将需要修改的数据强制写回主存,写回之前会在总线上发出缓存失效的信号,通过总线嗅探机制其他持有该变量地址的缓存行都会失效,需要使用该数据的时候都会到主存中读取,从而保证了可见性,而内存屏障同时也保证了指令的执行顺序,内存屏障前的指令必须在内存屏障后的指令执行. 所以也保证了有序性.