Java 面试题:volatile 可见性/有序性/原子性

一、volatile 三大特性

特性 说明
可见性 写立即刷主存,读从主存取,保证线程间可见
有序性 插入内存屏障,禁止特定重排序
原子性 不保证(如 i++ 仍是多步)

二、为什么不能保证原子性

i++ 是”读-改-写”三步,volatile 只保证可见,两个线程可能同时读到旧值各加一次,丢更新。计数要用 AtomicInteger(CAS)或 synchronized。

三、典型用法

  • 状态标志位:volatile boolean running,线程间安全通知停止;
  • 双重检查锁单例:instance 用 volatile 防指令重排导致的半初始化对象;
  • 配合 happens-before 规则建立可见性顺序。

与 synchronized 区别:volatile 轻量、仅可见+有序;synchronized 保证原子+可见+有序但重量(JDK6 后已优化)。