readwritelock通过分离读写锁提升多读少写场景的并发性能,允许多线程并发读、写操作独占,支持锁降级但禁止升级,需规范加解锁并避免持锁耗时操作。

ReadWriteLock 通过分离读写操作的锁机制,在多读少写的场景下显著提升并发性能。它允许多个线程同时读取共享资源,但写操作必须独占——这是实现高效访问的核心逻辑。
读锁与写锁的互斥规则
ReadWriteLock 包含两个关联锁:ReadLock(共享锁)和 WriteLock(排他锁)。它们遵循三条关键规则:
- 多个线程可同时持有读锁,只要没有线程持有写锁
- 写锁是排他的:一旦被占用,其他读锁和写锁都必须等待
- 写锁可降级为读锁(需先获取写锁再获取读锁),但读锁不能升级为写锁(会死锁)
使用 ReentrantReadWriteLock 的典型模式
Java 标准库提供 ReentrantReadWriteLock 实现,使用时需注意资源边界与锁生命周期:
- 读操作前调用 readLock().lock(),结束后务必在 finally 块中 unlock()
- 写操作同理,用 writeLock().lock() 和配套 unlock()
- 避免在持锁期间执行耗时操作(如 I/O、远程调用),否则阻塞其他线程
- 若读操作中需要条件判断后再写入,应先释放读锁、获取写锁重试(“双重检查锁定”变体)
性能优势与适用边界
相比 synchronized 或纯 ReentrantLock,ReadWriteLock 在读多写少场景下减少线程竞争:
- 100 个读线程 + 1 个写线程时,读吞吐量接近无锁水平;而单锁方案会让 99 个读线程排队
- 但写线程频繁时,读线程可能被持续饥饿——此时更适合用 StampedLock 或分段锁
- 锁开销略高于普通锁,因此简单场景(如仅 2–3 个线程)未必有收益
一个安全的缓存读写示例
以下结构体现典型用法,兼顾线程安全与效率:
- 读缓存:先加读锁,命中则返回;未命中则释放读锁,再抢写锁构建缓存
- 写缓存:加写锁后校验是否已存在,避免重复计算
- 所有 unlock() 都放在 try-finally 中,防止异常导致锁泄漏
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











