JAVA 内存模型(JMM)

并发的本质不是“多线程”,而是“在不确定执行顺序下,仍然保持因果一致性”。


一、问题定义:为什么需要 Java 内存模型(Why)

1.1 并发的第一性问题

在并发系统中,真正的问题并不是:

而是:

这三个问题可抽象为:

可见性(Visibility) + 有序性(Ordering) + 原子性(Atomicity)

如果没有统一约束:

将导致:


1.2 为什么“硬件一致性”不等于“程序一致性”

现代计算机通过 多级缓存 + 指令乱序执行 提升性能:

硬件的一致性目标是“最终一致 + 高性能”,而不是:

👉 JMM 的使命

在不可信的硬件与编译器优化之上,为 Java 程序员提供一个确定、可推理的并发语义模型


二、JMM 的抽象模型(What)

2.1 JMM 的定位

必须首先澄清一个关键误区:

JMM ≠ JVM 内存结构

维度JMMJVM 内存结构
性质抽象规范具体实现
关注点并发语义内存分配
目标可见性 / 有序性运行效率

JMM 是:

JVM 必须遵守的并发语义契约

而不是:


2.2 主内存 / 工作内存:最小并发抽象

JMM 用一个极简但足够表达并发问题的模型描述内存:

关键约束:

工作内存不是 JVM 的某个内存区域,而是对 CPU 缓存 / 寄存器 / 编译器暂存 的抽象。


2.3 happens-before:JMM 的核心抽象

2.3.1 happens-before 的本质

happens-before 不是时间先后关系,而是:

可见性与有序性的因果约束关系(Partial Order)

含义只有一个:

如果 A happens-before B,那么 A 的结果 对 B 可见,并且 A 的执行顺序 排在 B 之前

如果两个操作之间 不存在 happens-before 关系

👉 这不是 Bug,而是未定义并发语义


2.3.2 happens-before 的"天然规则"

这些规则并不是语法糖,而是 并发因果的基本公理

happens-before 规则集合 = JMM 的最小公理系统


2.4 as-if-serial 语义

JMM 允许大量重排序优化,但有一条不可打破的底线:

在单线程语义下,执行结果必须"看起来像是顺序执行的"

这条规则:


三、JMM 的并发三特性(模型层)

3.1 原子性

👉 原子性不是"操作不可分",而是:

在并发可观察层面,不可被中途观察到


3.2 可见性

可见性 = 写入结果 是否能被其他线程感知

JMM 提供三种"可见性通道":


3.3 有序性

指令重排序:


四、JMM 的实现手段(How)

JMM 不关心"怎么实现",但 JVM 必须用现实世界的工具去兑现语义承诺。


4.1 volatile:轻量级因果约束

语义本质:

实现层次:

适用场景:


4.2 synchronized:强因果封闭区

语义本质:

实现层次:

价值:


4.3 内存屏障:语义兑现工具

内存屏障不是给程序员用的,而是:

屏障类型:


五、工程视角:如何"用对"JMM

5.1 用 happens-before 思考并发,而不是"先加锁"

设计并发代码的核心问题应是:

我是否明确建立了线程间的因果关系?


5.2 JMM 不能替你解决的问题

JMM 只是:

并发世界的物理定律,而不是业务逻辑的守护神


六、演进与对比视角(长期价值)

关联内容(自动生成)