不能保证原子性

volatile 是怎么保证可见性和有序性的

volatile是怎么保证可见性的?

volatile 是在汇编层面加 Lock,使用缓存一致性协议(MESI)解决并发可见性的。

volatile 的功能就是被修改的变量在被修改后可以立即同步到主内存,被修饰的变量在每次使用之前都从主内存刷新。本质也是通过内存屏障来实现可见性

写内存屏障(Store Memory Barrier)可以促进处理器将当前 store buffer(存储缓存)的值写回主存。读内存屏障(Load Memory Barrier)可以促使处理器处理 invalidate queue(失效队列)。进而避免由于 Store Buffer 和 Invalidate Queue 的非实时性带来的问题。

volatile 是怎么保证有序性的?

多线程环境下,有序性问题产生的主要原因就是执行重排优化,而 Volatile 的另一个作用就是禁止指令重排优化。具体是通过对 Volatile 修饰的变量增加内存屏障来完成的!

参考

blog.51cto.com

volatile的可见性和禁止指令重排序怎么实现的?