volatile
语义
- 如果一个字段被声明成volatile,java线程内存模型确保所有线程看到这个变量的值是一致的。保证了线程间的可见性
- 如果对声明了Volatile变量进行写操作,JVM就会向处理器发送一条Lock前缀的指令,将这个变量所在缓存行的数据写回到系统内存, 一个处理器的缓存回写到内存会导致其他处理器的缓存无效
- 禁止进行指令重排序
- 当程序执行到volatile变量的读操作或者写操作时,在其前面的操作的更改肯定全部已经进行,且结果已经对后面的操作可见;在其后面的操作肯定还没有进行;
- 在进行指令优化时,不能将在对volatile变量访问的语句放在其后面执行,也不能把volatile变量后面的语句放到其前面执行。
- 使用条件
- 对变量的写操作不依赖于当前值
- 自增操作时会有问题
- 该变量没有包含在具有其他变量的不变式中
- a < b, 像这样的判断会有问题
- 对变量的写操作不依赖于当前值
- 优点
- 比synchronized的使用和执行成本会更低,因为它不会引起线程上下文的切换和调度。
- volatile 操作不会像锁一样造成阻塞
- 使用场景
- 状态标志
- 双重检查锁定
