怎么理解 volatile
2026/6/12 16:41:24 网站建设 项目流程

什么时候会用到 volatile

  • 多线程环境
  • 共享变量读写

多线程 + 只读共享变量 不需要
多线程 + 写共享变量(只要求可见性) volatile ✓
多线程 + 写共享变量(要求原子性) synchronized / AtomicXxx
单线程 不需要

volatile 关键字的来源

来源是因为有分级缓存,CPU缓存速度大于主内存缓存,多线程环境下,每个线程变量读写都是从主存先拷贝到线程自己的缓存中,然后再同步到主存,这个时候不同线程里对于同一个全局变量的值可能不一样

对于主存和CPU缓存变量的存储,有三种方案:

  • 只改CPU缓存(速记本),不修改主存(图书馆)
  • 每次修改CPU缓存,都修改主存回刷【性能差】
  • 修改CPU缓存后,合适的时候回刷主存【折中方案,这就是 CPU 和编译器的默认策略;不保证立刻刷回,但最终会刷回(什么时候刷由 CPU 和 JVM 决定)Java 默认用这种方式】

volatile的场景(可见性)

比如主存和线程都在执行定时任务,但是都依赖的全局变量 flag
如果主存 flag = true 改成了 false,线程里有可能会读取不到,导致线程定时任务一直在执行停不下来 while(flag)
也就是说主存和CPU缓存之间是双向的,如果需要同步就需要volatile关键词

其他

volatile 不保证原子性,如果需要原子性,需要读写同步的话,需要 synchronized 关键词
volatile 能够防止指令重排

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询