Skip to content
进阶

一句话答案

ReadWriteLock 读共享写独占,state 高 16 位读锁低 16 位写锁,支持锁降级(写→读)不支持升级(会死锁)。

核心要点

ReentrantReadWriteLock 核心设计:

  • state 拆分:int 32位 = 高16位(读锁持有数)+ 低16位(写锁重入数)
  • 读锁:共享模式,多个线程可同时持有
  • 写锁:独占模式,有写锁时其他读/写都阻塞

获取规则:

当前状态获取读锁获取写锁
无锁
有读锁❌(等待)
有写锁(非自己)❌(等待)❌(等待)
有写锁(自己)✅(锁降级)✅(重入)

锁降级:写锁 → 获取读锁 → 释放写锁(安全降级,保证数据可见性) 锁升级:不支持!(读锁→写锁会死锁)

适用场景: 缓存、配置管理(读多写少) 缺陷: 写线程可能饥饿 → JDK8 引入 StampedLock(乐观读)

追问与易错

追问方向:

  • 读写锁饥饿怎么解决?
  • 锁降级的意义?
  • StampedLock 的区别?

易错点:

  • ❌ 读锁可以升级为写锁——不支持会死锁!
  • ❌ 读写锁一定比 synchronized 快——读少写多时反而慢

💡 记忆锚点

读写锁像图书馆规则:多人可以同时看书(读共享),但有人在改书时其他人不能看也不能改(写独占)。state 一个 int 当两个用——高 16 位数读者人数,低 16 位数写者重入次数。可以从改书切换到看书(锁降级),但不能看着看着突然要改(锁升级会死锁)。