Java volatile 关键字在底层的 CPU 缓存一致性协议中是怎么工作的

冷炫風刃

冷炫風刃

2026-07-31

677人浏览

原创

volatile不直接执行mesi协议,而是通过jvm插入lock指令和内存屏障,触发cpu硬件的mesi状态流转:写操作使本核缓存行置m态并广播rfo令他核置i态,读操作因缓存失效被迫从主存或m态核重载最新值。

java volatile 关键字在底层的 cpu 缓存一致性协议中是怎么工作的

Java 中 volatile 关键字在底层并不直接“执行”缓存一致性协议,而是通过 JVM 生成的特定指令,触发 CPU 硬件层面的缓存一致性机制——主要是 MESI 协议,来保障多核环境下的变量可见性。

volatile 写操作如何触发 MESI 协议

当一个线程写入 volatile 变量时,JVM 会在对应汇编指令前插入 StoreStore 屏障、后插入 StoreLoad 屏障,并在实际写内存时附加 lock 前缀(x86 架构下)。这个 lock 指令会:

  • 锁定当前缓存行(cache line),确保原子性地更新该内存地址
  • 强制将修改后的值立即写回主内存(从 Modified 状态刷新)
  • 向总线广播 RFO(Read For Ownership)请求,通知其他 CPU 核心:“我要独占这个缓存行”
  • 其他核心收到 RFO 后,将自己缓存中对应地址的缓存行状态设为 Invalid (I),即失效

volatile 读操作如何强制获取最新值

当线程读取 volatile 变量时,JVM 插入 LoadLoadLoadStore 屏障,并确保该读操作不被优化为缓存副本访问。CPU 实际执行时会:

  • 检测本地缓存中该地址的状态:若为 I(无效),则必须从主内存重新加载
  • 若为 S(共享)或 E(独享),也需确认是否最新(依赖总线嗅探机制监听到的写广播)
  • 由于写操作已使其他缓存失效,读操作大概率触发一次主内存读取,从而拿到最新值

MESI 协议是硬件级协同基础

MESI 是 Intel/AMD 主流 CPU 实现缓存一致性的核心协议,它定义了每个缓存行的四种状态:

Java JDK 25
Java JDK 25

Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。

下载
  • M(Modified):数据仅在当前核缓存中,且已修改,与主内存不一致
  • E(Exclusive):数据仅在当前核缓存中,且与主内存一致
  • S(Shared):数据在多个核缓存中,均与主内存一致
  • I(Invalid):缓存行无效,下次访问必须重新加载

volatile 的语义正是借由这套状态机流转来落地:写 → 触发 M 状态 + RFO 广播 → 其他核转 I;读 → 遇 I 或需同步 → 强制重载主内存。

为什么不是所有变量都用 volatile

因为每次 volatile 读写都伴随缓存行失效和总线广播,开销远高于普通变量访问。尤其在高竞争场景下,频繁失效会导致:

  • 总线带宽争用加剧
  • 其他核心因缓存失效而频繁 stall(等待重载)
  • 伪共享(false sharing)问题放大——若两个 volatile 变量落在同一缓存行,互相干扰

所以 volatile 适合状态标志、一次性发布、双重检查锁中的 instance 引用等低频、无复合逻辑的场景,而非计数器或复合更新。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

3793

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

2796

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

2826

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

637

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

602

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

705

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1291

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

18844

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

646

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
SQL优化与排查(MySQL版)
SQL优化与排查(MySQL版)

共26课时 | 2.9万人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习