volatile关键字用于保证变量可见性和禁止指令重排序,但不保证原子性;它使线程每次读取都从主内存获取最新值、每次写入都立即刷新到主内存,并令其他线程缓存失效。

volatile 关键字在 Java 中主要用于确保变量的可见性和禁止指令重排序,但它不能保证原子性。它适用于一个线程写、多个线程读的简单场景,比如状态标志位。
volatile 如何解决可见性问题
Java 内存模型(JMM)规定:每个线程有自己的工作内存(如 CPU 缓存),线程对变量的操作基于本地副本。普通变量修改后,可能不会立即写回主内存,其他线程也未必及时从主内存重新读取——这就导致“不可见”。
使用 volatile 后,每次读操作都直接从主内存读取最新值;每次写操作都强制刷新到主内存,并使其他线程缓存中该变量失效。这样就保证了“一个线程改了,其他线程立刻看到”。
volatile 的典型适用场景
-
状态标志位:如控制线程运行的 boolean 变量(
volatile boolean running = true;) -
单次初始化的共享对象引用:如双重检查锁定中的 instance 字段(
private volatile Singleton instance;) - 作为信号量配合 wait/notify 或 LockSupport.park() 使用,但需注意它不提供互斥能力
volatile 不能做什么
它不保证复合操作的原子性。例如:volatile int count = 0;,执行 count++ 实际包含“读-改-写”三步,多个线程并发执行仍可能丢失更新。
此时应改用 AtomicInteger、synchronized 或 ReentrantLock。
正确使用 volatile 的要点
- 变量必须是独立存在的,不依赖其他变量的值(即不能用于“if (a && b)”这类依赖多个 volatile 变量的逻辑判断)
- 避免在 volatile 变量上做非原子的复合操作(如 ++、+=、自增赋值等)
- 如果变量本身是对象引用,volatile 仅保证引用本身的可见性,不保证对象内部字段的可见性
不复杂但容易忽略:volatile 是轻量级同步机制,用对了能提升性能,用错了反而掩盖并发 bug。
立即学习“Java免费学习笔记(深入)”;


















