volatile读插入LoadLoad+LoadStore屏障,确保前置普通读完成且后续写不重排到其前;写插入StoreStore+StoreLoad屏障,保证前置普通写刷回主存且后续读写不提前,共同建立happens-before关系。

Java 内存模型(JMM)中,volatile 读操作前插入 LoadLoad + LoadStore 屏障,volatile 写操作后插入 StoreStore + StoreLoad 屏障。这些屏障由 JVM 自动插入,不是开发者手动控制,作用是建立 happens-before 关系、保障可见性与有序性。
volatile 读:LoadLoad + LoadStore
当执行 if (flag) 或 int v = flag 这类 volatile 读时,JVM 在该读指令之前插入:
-
LoadLoad 屏障:确保它前面的所有普通读(如
r1 = a;)已完成,不会被重排到该 volatile 读之后; -
LoadStore 屏障:禁止它后面的所有写操作(如
result = r1 * 2;)被重排到该 volatile 读之前,同时强制从主内存或其它核心缓存加载最新值(触发 MESI 协议的重载行为)。
volatile 写:StoreStore + StoreLoad
当执行 flag = true 这类 volatile 写时,JVM 在该写指令之后插入:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
StoreStore 屏障:确保它前面的所有普通写(如
num = 2;)已刷新到主内存,不会被重排到该 volatile 写之后; - StoreLoad 屏障:阻止它后面的所有读/写操作被重排到该 volatile 写之前;同时强制将该值写回主内存,并广播缓存行失效(Invalid),使其他线程后续读取时无法复用旧缓存。
为什么是这四类,不是其他组合?
每类屏障对应 JMM 对“读-读”“读-写”“写-写”“写-读”四种依赖关系的约束:
立即学习“Java免费学习笔记(深入)”;
- LoadLoad 约束读-读顺序;
- LoadStore 约束读-写顺序;
- StoreStore 约束写-写顺序;
- StoreLoad 是最强屏障,专用于防止写-读重排,并承担缓存同步职责。
它们共同构成 volatile 写 → volatile 读之间的 happens-before 链,是跨线程可见性的底层支撑。

















