Java 内存模型 JMM 深度解析(可见性、有序性、原子性)

1. 为什么会有线程安全问题? 根本原因只有一个: CPU 高速缓存 + 多线程并发 2. Java 内存模型(JMM)结构 主内存 ↑ ↓ 线程工作内存(副本) 每个线程: 从主内存拷贝变量</

1. 为什么会有线程安全问题?

根本原因只有一个:

CPU 高速缓存 + 多线程并发

2. Java 内存模型(JMM)结构

主内存
  ↑        ↓
线程工作内存(副本)

每个线程:

  • 从主内存拷贝变量

  • 修改后未必立刻写回

3. JMM 三大核心特性

1️⃣ 原子性

  • 操作不可被中断

  • int++ ❌(不是原子操作)

2️⃣ 可见性

  • 一个线程修改,另一个线程是否可见

  • volatile / synchronized 可保证

3️⃣ 有序性

  • 编译器 & CPU 指令重排

  • volatile 禁止重排

4. happens-before 原则(高频面试)

  • 锁的释放 → 锁的获取

  • volatile 写 → volatile 读

  • 线程 start → 线程执行

  • 线程结束 → join

5. 本篇总结

  • JMM 是理解并发 Bug 的钥匙

  • 多线程问题 ≠ 代码问题,而是 内存问题

第四篇:synchronized 底层原理(锁升级、对象头、Monitor)

1. synchronized 到底锁的是什么?

synchronized (obj) {}

锁的是:
👉 对象头中的 Monitor

2. 对象头结构(Mark Word)

包含:

  • 锁标志位

  • 线程 ID

  • 偏向锁信息

3. 锁升级过程(JDK 6+)

无锁
 ↓
偏向锁
 ↓
轻量级锁
 ↓
重量级锁

锁升级不可逆!

4. 各类锁对比

锁类型

适合场景

偏向锁

单线程

轻量级锁

少量竞争

重量级锁

高并发

5. 为什么 synchronized 性能不再差?

  • 自旋锁

  • 锁消除

  • 锁粗化

👉 JDK 1.8 后可以放心使用

Java 线程创建方式深度剖析(Runnable、Callable、Future) 2026-02-05
线程池 ThreadPoolExecutor 终极实战与调优 2026-02-05

评论区