Java volatile核心特性是保证可见性、禁止指令重排序、不保证原子性;它通过强制主内存读写和内存屏障实现可见性与有序性,但无法保证复合操作的原子性。
Java volatile 关键字的核心特性就三个:保证可见性、禁止指令重排序、不保证原子性。它不是万能锁,而是一种轻量级的内存语义控制机制,专为解决特定并发问题设计。
一个线程修改了 volatile 变量的值,其他线程能立即看到这个新值。这是因为:
典型场景:用 volatile 布尔标志位(如 stop = true)通知其他线程退出循环,避免因缓存不一致导致的死循环。
编译器和 CPU 为了性能优化,可能调整语句执行顺序,但 volatile 会插入内存屏障(Memory Barrier),约束重排序行为:
之后;典型用途:单例模式中的双重检查锁定(DCL),用 volatile 修饰 instance 字段,防止对象尚未构造完成就被其他线程使用。
volatile 不能替代 synchronized 或 AtomicInteger 来做复合操作:
简单说:volatile 管“看得到”和“不乱序”,不管“能不能一起做完”。
基本上就这些。