这一组概念非常容易混,因为它们看起来都和“锁”有关,但其实不在同一层面。
理解这组概念最重要的一句话是:
悲观锁和乐观锁,是处理并发冲突的思路;自旋锁和互斥锁,是具体的加锁实现方式。
如果不先把这两层分开,就很容易越学越乱。
一、先把四个概念分层
1. 悲观锁、乐观锁
这是:
并发控制策略
也就是说,它们描述的是:
- 你如何看待冲突
- 冲突发生前要不要先防住
- 冲突发生后如何处理
2026/4/1...大约 9 分钟
这一组概念非常容易混,因为它们看起来都和“锁”有关,但其实不在同一层面。
理解这组概念最重要的一句话是:
悲观锁和乐观锁,是处理并发冲突的思路;自旋锁和互斥锁,是具体的加锁实现方式。
如果不先把这两层分开,就很容易越学越乱。
这是:
并发控制策略
也就是说,它们描述的是:
基于 JDK 1.8+ 的 synchronized 关键字深度解析。
synchronized 是什么?
Java 内置的关键字,用于实现线程同步,本质是对象锁(Monitor Lock)。
提供的三大特性:
| 特性 | 说明 |
|---|---|
| 原子性 | 同步块内的操作要么全部执行,要么全部不执行 |
| 可见性 | 释放锁时,将工作内存刷回主内存;获取锁时,从主内存重新读取 |
| 有序性 | 同一时刻只有一个线程执行同步块,表现为串行 |
基于 JDK 1.8 源码的读写锁核心原理分析。
假设你有一个缓存,100 个线程读,1 个线程偶尔写。如果用 ReentrantLock:
// 悲剧:读也要排队!
lock.lock();
try {
return cache.get(key); // 明明只是读,也要等锁
} finally {
lock.unlock();
}
待定,暂时先不看这个邮戳锁,后面再来细细研究!
基于 JDK 1.8 源码的 JUC 锁核心原理分析。
ReentrantLock 是独占模式(Exclusive)的可重入互斥锁,基于 AQS 实现,是 synchronized 关键字的替代方案。
// AQS 中
private volatile int state;