Java volatile核心特性是保证可见性、禁止指令重排序、不保证原子性;它通过强制主内存读写和内存屏障实现可见性与有序性,但无法保证复合操作的原子性。

Java volatile 关键字的核心特性就三个:保证可见性、禁止指令重排序、不保证原子性。它不是万能锁,而是一种轻量级的内存语义控制机制,专为解决特定并发问题设计。
保证可见性
一个线程修改了 volatile 变量的值,其他线程能立即看到这个新值。这是因为:
- 每次读 volatile 变量,都强制从主内存加载最新值,不使用工作内存中的旧缓存;
- 每次写 volatile 变量,都强制把新值刷新回主内存,不延迟同步;
- 底层依赖 MESI 协议和总线嗅探,让其他 CPU 缓存中对应缓存行失效,确保后续读取必须重新加载。
典型场景:用 volatile 布尔标志位(如 stop = true)通知其他线程退出循环,避免因缓存不一致导致的死循环。
禁止指令重排序
编译器和 CPU 为了性能优化,可能调整语句执行顺序,但 volatile 会插入内存屏障(Memory Barrier),约束重排序行为:
立即学习“Java免费学习笔记(深入)”;
大高朋团购系统是一套Groupon模式的开源团购程序,开发的一套网团购程序,系统采用ASP+ACCESS开发的团购程序,安装超简,功能超全面,在保留大高朋团购系统版权的前提下,允许所有用户免费使用。大高朋团购系统内置多种主流在线支付接口,所有网银用户均可无障碍支付;短信发送团购券和实物团购快递发货等。 二、为什么选择大高朋团购程序系统? 1.功能强大、细节完善 除了拥有主流团购网站功能,更特别支
- volatile 写操作前的所有读写,不能被重排到该写之后;
- volatile 读操作后的所有读写,不能被重排到该读之前;
- 这提供了“先行发生”(happens-before)关系:一个线程对 volatile 变量的写,对另一个线程对该变量的读可见,且写之前的所有内存操作也对读线程可见。
典型用途:单例模式中的双重检查锁定(DCL),用 volatile 修饰 instance 字段,防止对象尚未构造完成就被其他线程使用。
不保证原子性
volatile 不能替代 synchronized 或 AtomicInteger 来做复合操作:
- 对 volatile 变量的单次读或单次写是原子的(比如 flag = true 或 int x = count);
- 但像 count++ 这种操作包含“读-改-写”三步,volatile 无法保证整个过程不可中断;
- 多个线程同时执行 count++,结果很可能小于预期,必须配合锁或原子类。
简单说:volatile 管“看得到”和“不乱序”,不管“能不能一起做完”。
基本上就这些。










