ReentrantReadWriteLock 是 Java 中支持读写分离的可重入锁,允许多读单写,提升读多写少场景性能;支持锁降级但不支持锁升级,需手动加解锁并避免与 synchronized 混用。

ReentrantReadWriteLock 是 Java 并发包(java.util.concurrent.locks)中提供的读写分离锁实现,它允许多个线程同时读、但写操作独占,从而在读多写少场景下显著提升并发性能。
读锁与写锁的分工机制
它内部维护一对锁:一个读锁(共享锁)和一个写锁(排他锁):
- 读锁可被多个线程同时获取,只要没有线程持有写锁;
- 写锁是独占的,获取时要求既无其他写锁,也无任何读锁;
- 读锁和写锁不能共存——即“读-写互斥”、“写-写互斥”,但“读-读不互斥”。
基本用法:声明与加锁释放
使用时需显式创建锁对象,并分别调用 readLock() 或 writeLock() 获取对应锁:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
Lock readLock = rwLock.readLock();
Lock writeLock = rwLock.writeLock();
// 读操作
readLock.lock();
try {
// 安全读取共享数据
} finally {
readLock.unlock();
}
// 写操作
writeLock.lock();
try {
// 安全修改共享数据
} finally {
writeLock.unlock();
}
注意重入性与锁降级
该锁支持可重入:同一线程可多次获取同一类锁(如重复加读锁),且需对应次数释放;但它不支持锁升级(不能在持有读锁时再获取写锁),否则会死锁;但支持锁降级(先持写锁,再获取读锁,最后释放写锁),这是唯一安全的跨锁切换方式:
立即学习“Java免费学习笔记(深入)”;
- 典型锁降级用于“更新后立即读取最新值”的场景;
- 必须保证写锁未释放前就获取读锁,否则中间可能被其他线程篡改;
- 降级后要记得释放写锁,只保留读锁(若还需继续读)。
适用场景与注意事项
适合读远多于写、共享数据一致性要求高、且读操作耗时较长的场景,比如缓存、配置中心、只读报表等:
- 避免滥用:若写操作频繁或读操作极轻量,用普通
synchronized可能更高效; - 公平性可选:构造时传
true启用公平模式(按等待顺序分配锁),但会降低吞吐量; - 务必在
finally块中释放锁,防止锁泄漏; - 不与
synchronized混用同一资源——它们互不感知,无法形成真正互斥。

















