volatile 关键字的作用?
发布于
一、两大作用
- 可见性:被 volatile 修饰的变量,一个线程修改后其他线程立即可见。实现:写入时立即刷新主内存,读取时从主内存重新加载。
- 禁止指令重排:在读写操作前后插入内存屏障。
二、不保证原子性
volatile int count = 0;
count++; // 不是原子操作,多线程下仍有问题
自增是 read-modify-write 三步,volatile 只保证可见不保证原子。需要原子性用 AtomicInteger 或加锁。
三、使用场景
- 状态标志位:
volatile boolean running = true。 - 双重检查锁单例中的 instance 变量(防止指令重排导致拿到未初始化对象)。
四、与 synchronized 区别
volatile 不互斥,synchronized 互斥且保证可见和原子。