volatile通过内存屏障禁止指令重排序以保证有序性:写操作后插入storeload屏障,读操作前插入loadload和loadstore屏障,并基于happens-before规则确保写操作对后续读操作可见,但仅限于volatile变量自身,不保证原子性或全局有序。

volatile 通过插入内存屏障(Memory Barrier)和禁止指令重排序来保证有序性,它不改变单线程内的执行结果,但约束多线程间操作的观察顺序。
volatile 写操作禁止重排序
当对一个 volatile 变量执行写操作时,JVM 会在该操作之后插入一个 StoreLoad 屏障,确保:
- 写操作之前的任意读、写指令,不会被重排到该写操作之后;
- 该写操作本身会立即刷新到主内存,且后续其他操作必须等它完成后再执行。
volatile 读操作禁止重排序
当对一个 volatile 变量执行读操作时,JVM 会在该操作之前插入 LoadLoad 和 LoadStore 屏障,确保:
- 该读操作不会被重排到它前面的任意读、写指令之前;
- 它后面的任意读、写指令也不能被重排到该读操作之前;
- 读取时强制从主内存加载最新值,而不是使用工作内存中的旧副本。
借助 happens-before 建立执行顺序
Java 内存模型定义了 volatile 变量规则:对一个 volatile 变量的写操作 happens-before 后面对该变量的读操作。这意味着:
- 写操作的结果对后续读操作一定可见;
- 写操作之前的所有动作,对读操作之后的代码也“可见”——形成跨线程的顺序约束;
- 这种语义不依赖锁,但比 synchronized 更轻量、更局限。
注意:它只限制相关操作,不保证全局有序
volatile 的有序性是“有条件的”:
- 它只对 volatile 变量自身的读写施加屏障,不影响其他普通变量的重排序;
- 它不能防止两个 volatile 操作之间的普通操作被重排(除非它们自身也被 volatile 修饰或用其他同步机制包裹);
- 它不提供互斥或原子性,比如
count++即使 count 是 volatile,依然不是原子操作。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











