直接回答:volatile 保证两点——可见性(一个线程的修改对其他线程立即可见)和有序性(禁止相关的指令重排序)。它不能保证原子性。
展开解析:可见性靠内存屏障实现:写 volatile 变量时把当前线程工作内存的值刷新到主内存,读时直接从主内存加载,绕过 CPU 缓存不一致的问题。有序性指编译器和 CPU 不会把 volatile 变量的读写与前后特定操作乱序重排,典型应用是双重检查锁定(DCL)单例中防止对象"半初始化"被其他线程看到。
为什么原子性不成立:count++ 是"读—改—写"三步的复合操作,volatile 只能保证每步读到最新值,挡不住两个线程交错执行,结果仍可能丢失更新。
volatile int count;
count++; // 两个线程并发执行,结果可能只加了一次
要保证原子性需用 synchronized、ReentrantLock 或 AtomicInteger(CAS)。
适用场景:单一变量的状态标志(如 volatile boolean running)、不依赖当前值的写入。追问:与 synchronized 的区别、JMM 中 volatile 写-读的 happens-before 关系。