一、volatile 三大特性
| 特性 | 说明 |
|---|---|
| 可见性 | 写立即刷主存,读从主存取,保证线程间可见 |
| 有序性 | 插入内存屏障,禁止特定重排序 |
| 原子性 | 不保证(如 i++ 仍是多步) |
二、为什么不能保证原子性
i++ 是”读-改-写”三步,volatile 只保证可见,两个线程可能同时读到旧值各加一次,丢更新。计数要用 AtomicInteger(CAS)或 synchronized。
三、典型用法
- 状态标志位:
volatile boolean running,线程间安全通知停止; - 双重检查锁单例:
instance用 volatile 防指令重排导致的半初始化对象; - 配合 happens-before 规则建立可见性顺序。
与 synchronized 区别:volatile 轻量、仅可见+有序;synchronized 保证原子+可见+有序但重量(JDK6 后已优化)。