可见性
volatile保证了修饰的共享变量在转换为汇编语言时,会加上一个以lock为前缀的指令,当CPU发现这个指令时,立即会做两件事情:
- 将当前内核中线程工作内存中该共享变量刷新到主存;
- 通知其他内核里缓存的该共享变量内存地址无效;
防止指令重排

指令重排.png
普通变量: 仅保证在该方法执行过程中所有依赖赋值结果的地方都能得到正确的结果,而不能保证变量赋值操作的顺序和代码中的顺序一致。
被volatile修饰的变量,会加一个lock前缀的汇编指令。若变量被修改后,会立刻将变量由工作内存回写到主存中。那么意味了之前的操作已经执行完毕: Memory Barrier(内存屏障)。

读写屏障.png
总结: 其实就是汇编之后得到的指令是会加一个lock前缀的汇编指令从而出现内存屏障.