Volatile缓存可见性实现原理
- 底层实现主要是通过汇编lock前缀指令,它会锁定这块内存区域的缓存(缓存行锁定),并回写到主内存。
指令重排序与内存屏障
- 并发编程三大特性:可见性,有序性,原子性
- 可见性:当一个线程修改了共享属性的值后,其他线程能立刻看到共享属性值的更改
- 原子性:一个操作/一系列操作
- 有序性:程序的运行顺序看起来和我们编写逻辑的顺序一致
- volatile保证可见性与有序性,但是不保证原子性,保证原子性需要借助synchronized这样的锁机制
- 指令重排序
- 在不影响单线程程序执行结果的前提下,计算机为了最大限度的发挥机器性能,会对机器指令重排序优化
- 重排序会遵循as-if-serial与happens-before原则
- as-if-serial:不管怎么重排序,(单线程)程序的执行结果不能被改变。编译器和处理器不会对存在数据依赖关系的操作做重排序,因为这种重排序会改变执行结果。