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 后可以放心使用