volatile

语义

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