题目:什么是 Java 内存模型(JMM)?
难度:low(题库标注)
标签:java/jmm, difficulty/low
评分:⭐⭐☆☆☆(2/5)
Java 内存模型 JMM 是 Java 的参照 MEMORY 内存模型去构建的对线程跟内存的管理模型。核心是为了保证线程的线程的那个可见性、一致性、原子性的。主要的有它自定义的几个关键字,volatile、synchronized 的。
优点:
不足:
补充(必背):
JMM 的核心定义:
JMM 是 JLS 定义的一套抽象规则,屏蔽底层硬件差异,规定了线程之间如何通过内存交换变量的值——即"什么时候把工作内存的值刷回主内存、什么时候从主内存读回工作内存"。
三层结构(对应硬件):
| JMM 抽象 | 硬件对应 | 说明 |
|---|---|---|
| 主内存(Main Memory) | 物理内存 | 所有线程共享 |
| 工作内存(Working Memory) | CPU 缓存 + 寄存器 | 每个线程私有,保存主内存变量的副本 |
| 处理器缓存(L1/L2/L3) | — | 实现细节,JMM 不直接暴露 |
三大并发问题 + 解决手段:
| 问题 | 现象 | 解决手段 |
|---|---|---|
| 可见性 | 线程 A 改了变量,线程 B 看不到 | volatile(内存屏障)/ synchronized(解锁时刷新) |
| 原子性 | i++ 被拆成读、加、写三步,中间被中断 | synchronized / Lock / AtomicXxx(CAS) |
| 有序性 | 指令重排导致顺序与源码不同 | volatile(屏障禁止重排)/ happens-before 规则 |
两大关键字的原理定位:
JMM 与其他概念的区别(面试官最爱问):
| 概念 | 是什么 | 定位 |
|---|---|---|
| JMM | 规范(JLS 定义) | 抽象规则 |
| JVM | 实现(HotSpot 等) | 具体执行 |
| MESI | 缓存一致性协议 | 硬件层 |
| 内存屏障 | 指令序列 | 硬件实现手段 |
| happens-before | 抽象规则 | JMM 提供的可见性契约 |
核心考点定位:考察对 JMM 抽象本质的理解——它是一个规范而非实现,通过屏蔽硬件差异让 Java 代码在不同 CPU 上有可预测的并发语义。
知识点拆解:
考察方向:
延伸递进面试题:
面试官您好,Java 内存模型 JMM 是 JLS 定义的一套抽象规范,不是 JVM 本身。它的作用是屏蔽底层硬件差异,规定线程之间如何交换变量的值——让 Java 代码在不同 CPU 上有可预测的并发语义。
JMM 的核心是三层结构:主内存(对应物理内存,所有线程共享)和工作内存(对应 CPU 缓存 + 寄存器,每个线程私有)。线程只操作工作内存里的变量副本,什么时候把值刷回主内存、什么时候从主内存读回来,由 JMM 规则决定。
JMM 要解决的三大并发问题:原子性(i++ 是否被拆)、可见性(线程 A 改了 B 能否看到)、有序性(指令能否被重排)。对应的手段是:volatile 解决可见性和有序性(靠内存屏障),synchronized 同时解决三者(靠 monitor 机制 + happens-before 规则),AtomicXxx 靠 CAS 解决原子性。
几个容易搞混的点:第一,JMM ≠ JVM,JMM 是规范、JVM 是实现;第二,MESI 是硬件缓存一致性协议,JMM 是软件规范,两者互补而非替代;第三,volatile 保证可见性和有序性但不保证原子性,比如 count++ 不能用 volatile;第四,"一致性"是 CAP/事务领域概念,JMM 用的是"有序性"这个术语。