HoRain云--深入理解Java内存模型JMM

  

🎬 HoRain云小助手个人主页

 🔥 个人专栏: 《Linux 系列教程》《c语言教程

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

专栏介绍

专栏名称

专栏介绍

《C语言》

本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。

《网络协议》

本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制!

《docker容器精解篇》

全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。

《linux系列》

本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。

《python 系列》

本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。

《试题库》

本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等)

目录

⛳️ 推荐

专栏介绍

💡 深入理解核心概念

主内存与工作内存的抽象

可见性、有序性与原子性

📜 Happens-Before 规则

💎 总结


img

Java 内存模型(JMM)是 Java 并发编程的基石,它定义了多线程环境下,线程如何与内存进行交互,以及如何保证数据访问的一致性、可见性和有序性。简单来说,JMM 是一个抽象规范,它屏蔽了不同硬件和操作系统在内存访问上的差异,为 Java 程序员提供了统一的内存访问视图,确保了 Java 程序“一次编写,到处运行”的能力在并发场景下依然有效 。

为了让你快速把握全貌,下表总结了 JMM 最核心的几个概念及其目标和实现机制:

核心概念

目标(要解决的问题)

关键实现机制

主内存与工作内存

定义共享变量的访问规则,明确线程间通信方式

主内存存储所有共享变量,每个线程拥有私有的工作内存副本 。

内存交互操作

规范工作内存和主内存之间数据同步的原子操作

定义了 lock, unlock, read, load, use, assign, store, write等 8 种原子操作 。

可见性

确保一个线程对共享变量的修改能及时被其他线程看到

volatile关键字、synchronized关键字、final关键字 。

有序性

确保程序执行顺序符合代码预期,防止指令重排序带来问题

volatile关键字、synchronized关键字、happens-before​ 原则 。

原子性

保证特定操作不可中断,要么全部完成,要么完全不执行

synchronized关键字、java.util.concurrent.atomic包下的原子类 。

💡 深入理解核心概念

主内存与工作内存的抽象

你可以将主内存想象成所有线程共享的公共存储区,而每个线程都有一个自己私有的临时工作区(工作内存)。线程不能直接操作主内存中的变量,只能操作自己工作内存中的变量副本 。这就好比图书馆(主内存)里有一本公共的记事本(共享变量),每个读者(线程)想修改内容时,需要先复印一页(副本)到自己的座位上(工作内存)进行修改,然后再将修改好的复印件放回公共记事本的位置 。

可见性、有序性与原子性

JMM 主要围绕这三个特性建立,它们是理解并发编程线程安全的关键 。

  1. 可见性

    一个线程修改了共享变量的值后,其他线程能够立即看到这个修改后的值​ 。volatile关键字是保证可见性的最直接方式之一,它能确保变量的修改立刻刷新到主内存,并且每次使用前都从主内存重新读取 。synchronized关键字同样能保证可见性,因为在释放锁时,会将工作内存中的修改同步到主内存 。

  2. 有序性

    即程序执行的顺序按照代码的先后顺序执行 。但在多线程环境下,为了优化性能,编译器和处理器可能会对指令进行重排序​ 。JMM 通过 happens-before​ 原则来定义操作之间的偏序关系,确保正确同步的程序执行结果符合预期 。volatilesynchronized关键字都可以防止特定类型的重排序 。

  3. 原子性

    指一个或多个操作作为一个不可分割的整体执行,中间不会被线程调度打断 。JMM 直接保证了基本数据类型的读写(除 long 和 double 的非原子性协定外)是原子性的 。对于更复杂的操作(如 i++),则需要通过 synchronizedLock等同步机制来保证其原子性 。

📜 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)是编写正确、高效并发程序的关键。它通过定义主内存与工作内存的抽象关系、八大内存交互操作,并围绕可见性、有序性和原子性这三大特性,建立了一套完整的规范。volatilesynchronized等关键字以及 Happens-Before 规则,是 JMM 提供给开发者实现线程安全的重要工具。

希望这些解释能帮助你更好地理解 JMM。如果你对某个特定的并发场景或关键字有更深入的兴趣,我们可以继续探讨。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值