个人总结
volatile 保障了共享变量在工作线程之间的可见性&禁止指令重排。可见性的问题是因为CPU的多级缓存架构导致的,指令重排是为了对程序进行优化导致的。在单线程中是不存在可行性和顺序性的问题, 通俗的讲操作之间如果没有数据依赖性,可以进行任意重拍,不会影响执行结果(as-if-serial语义)。 但是多个线程之间的数据依赖和相互影响编译器&cpu层面无法感知,需要编译器&CPU的上层来决定。 为了解决多线程场景下 可见性和指令重拍的问题, Java引入了 JMM , JMM是一套规范 定义工作内存与主内存的数据交互方式。为了描述这个规范, JMM引入了 happen-before原则,用来描述多个操作之间的内存可见性,顺序性。参考happen-before原则中对volatile的描述可以:volatile关键字要保障 可见性&顺序性。 在JMM层面 volatile 是通过 JMM层面的内存屏障实现的(可以描述一下 JMM层面4个内层屏障,以及在volatile描述的变量前轴都加哪些屏障),再具体到汇编语言层面是通过lock指令实现的。