外观
一句话答案
ReadWriteLock 读共享写独占,state 高 16 位读锁低 16 位写锁,支持锁降级(写→读)不支持升级(会死锁)。
核心要点
ReentrantReadWriteLock 核心设计:
- state 拆分:int 32位 = 高16位(读锁持有数)+ 低16位(写锁重入数)
- 读锁:共享模式,多个线程可同时持有
- 写锁:独占模式,有写锁时其他读/写都阻塞
获取规则:
| 当前状态 | 获取读锁 | 获取写锁 |
|---|---|---|
| 无锁 | ✅ | ✅ |
| 有读锁 | ✅ | ❌(等待) |
| 有写锁(非自己) | ❌(等待) | ❌(等待) |
| 有写锁(自己) | ✅(锁降级) | ✅(重入) |
锁降级:写锁 → 获取读锁 → 释放写锁(安全降级,保证数据可见性) 锁升级:不支持!(读锁→写锁会死锁)
适用场景: 缓存、配置管理(读多写少) 缺陷: 写线程可能饥饿 → JDK8 引入 StampedLock(乐观读)
追问与易错
追问方向:
- 读写锁饥饿怎么解决?
- 锁降级的意义?
- StampedLock 的区别?
易错点:
- ❌ 读锁可以升级为写锁——不支持会死锁!
- ❌ 读写锁一定比 synchronized 快——读少写多时反而慢
💡 记忆锚点
读写锁像图书馆规则:多人可以同时看书(读共享),但有人在改书时其他人不能看也不能改(写独占)。state 一个 int 当两个用——高 16 位数读者人数,低 16 位数写者重入次数。可以从改书切换到看书(锁降级),但不能看着看着突然要改(锁升级会死锁)。