volatile 关键字的作用?

发布于

一、两大作用

  1. 可见性:被 volatile 修饰的变量,一个线程修改后其他线程立即可见。实现:写入时立即刷新主内存,读取时从主内存重新加载。
  2. 禁止指令重排:在读写操作前后插入内存屏障。

二、不保证原子性

volatile int count = 0;
count++;   // 不是原子操作,多线程下仍有问题

自增是 read-modify-write 三步,volatile 只保证可见不保证原子。需要原子性用 AtomicInteger 或加锁。

三、使用场景

  • 状态标志位:volatile boolean running = true。
  • 双重检查锁单例中的 instance 变量(防止指令重排导致拿到未初始化对象)。

四、与 synchronized 区别

volatile 不互斥,synchronized 互斥且保证可见和原子。