volatile 特性
- 保证可见性,不保证原子性
- 写volatile修饰的变量,JVM会把线程的本地内存变量强制更新到主内存中
- 写volatile修饰的变量,导致其它线程从主内存读取
- 静止指令重排序
指令重排序是指编译器和处理器为优化程序性能对指令进行排序的手段。遵循规则:不会对存在依赖关系指令和影响单线程下的执行结果 进行重新排序
volatile原理
jvm底层用内存屏障来实现
- 确保指令排序时不会把内存屏障位置前后的指令相互排序
- 会强制将线程本地内存的修改立即写到主内存
- 写操作会导致其它线程本地内存缓存失效,写之后,其它线程会从主内存读取
多线程中,只有一个线程写,其它线程都是读的时候,可以用volatile修饰变量。 场景单例的双重锁的实现方式