HoRain云--深入理解Java内存模型JMM
本文摘要: Java内存模型(JMM)是Java并发编程的核心规范,定义了多线程环境下内存访问的一致性规则。JMM通过主内存与工作内存的抽象模型,规范了线程间共享变量的访问机制,并围绕可见性、有序性和原子性三大特性,提供了volatile、synchronized等关键工具。文中详细解析了Happens-Before原则、内存交互操作等核心概念,帮助开发者理解并发程序中的数据竞争与线程安全问题。掌

🎬 HoRain云小助手:个人主页
🔥 个人专栏: 《Linux 系列教程》《c语言教程》
⛺️生活的理想,就是为了理想的生活!
⛳️ 推荐
前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。
专栏介绍
|
专栏名称 |
专栏介绍 |
|
本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。 |
|
|
本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制! |
|
|
全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。 |
|
|
本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。 |
|
|
本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。 |
|
|
本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等) |
目录

Java 内存模型(JMM)是 Java 并发编程的基石,它定义了多线程环境下,线程如何与内存进行交互,以及如何保证数据访问的一致性、可见性和有序性。简单来说,JMM 是一个抽象规范,它屏蔽了不同硬件和操作系统在内存访问上的差异,为 Java 程序员提供了统一的内存访问视图,确保了 Java 程序“一次编写,到处运行”的能力在并发场景下依然有效 。
为了让你快速把握全貌,下表总结了 JMM 最核心的几个概念及其目标和实现机制:
|
核心概念 |
目标(要解决的问题) |
关键实现机制 |
|---|---|---|
|
主内存与工作内存 |
定义共享变量的访问规则,明确线程间通信方式 |
主内存存储所有共享变量,每个线程拥有私有的工作内存副本 。 |
|
内存交互操作 |
规范工作内存和主内存之间数据同步的原子操作 |
定义了 |
|
可见性 |
确保一个线程对共享变量的修改能及时被其他线程看到 |
|
|
有序性 |
确保程序执行顺序符合代码预期,防止指令重排序带来问题 |
|
|
原子性 |
保证特定操作不可中断,要么全部完成,要么完全不执行 |
|
💡 深入理解核心概念
主内存与工作内存的抽象
你可以将主内存想象成所有线程共享的公共存储区,而每个线程都有一个自己私有的临时工作区(工作内存)。线程不能直接操作主内存中的变量,只能操作自己工作内存中的变量副本 。这就好比图书馆(主内存)里有一本公共的记事本(共享变量),每个读者(线程)想修改内容时,需要先复印一页(副本)到自己的座位上(工作内存)进行修改,然后再将修改好的复印件放回公共记事本的位置 。
可见性、有序性与原子性
JMM 主要围绕这三个特性建立,它们是理解并发编程线程安全的关键 。
-
可见性
一个线程修改了共享变量的值后,其他线程能够立即看到这个修改后的值 。
volatile关键字是保证可见性的最直接方式之一,它能确保变量的修改立刻刷新到主内存,并且每次使用前都从主内存重新读取 。synchronized关键字同样能保证可见性,因为在释放锁时,会将工作内存中的修改同步到主内存 。 -
有序性
即程序执行的顺序按照代码的先后顺序执行 。但在多线程环境下,为了优化性能,编译器和处理器可能会对指令进行重排序 。JMM 通过 happens-before 原则来定义操作之间的偏序关系,确保正确同步的程序执行结果符合预期 。
volatile和synchronized关键字都可以防止特定类型的重排序 。 -
原子性
指一个或多个操作作为一个不可分割的整体执行,中间不会被线程调度打断 。JMM 直接保证了基本数据类型的读写(除 long 和 double 的非原子性协定外)是原子性的 。对于更复杂的操作(如
i++),则需要通过synchronized或Lock等同步机制来保证其原子性 。
📜 Happens-Before 规则
Happens-Before 是 JMM 的核心理论,它是判断数据是否存在竞争、线程是否安全的重要依据 。常见的规则包括 :
-
程序顺序规则:一个线程内,前面的操作 happens-before 于后续的任何操作。
-
volatile 变量规则:对一个 volatile 变量的写操作 happens-before 于后续对这个变量的读操作。
-
锁规则:对一个锁的解锁操作 happens-before 于后续对这个锁的加锁操作。
-
传递性:如果 A happens-before B,且 B happens-before C,那么 A happens-before C。
💎 总结
理解 Java 内存模型(JMM)是编写正确、高效并发程序的关键。它通过定义主内存与工作内存的抽象关系、八大内存交互操作,并围绕可见性、有序性和原子性这三大特性,建立了一套完整的规范。volatile、synchronized等关键字以及 Happens-Before 规则,是 JMM 提供给开发者实现线程安全的重要工具。
希望这些解释能帮助你更好地理解 JMM。如果你对某个特定的并发场景或关键字有更深入的兴趣,我们可以继续探讨。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙
更多推荐



所有评论(0)