reentrantreadwritelock 是 java 中读写分离锁,允许多读单写,适合读多写少场景;读锁共享可重入,写锁互斥可重入且优先级更高;需严格配对 lock/unlock,禁止读锁升级为写锁,支持锁降级与公平性配置。

ReentrantReadWriteLock 是 Java 并发包中提供的读写分离锁,它允许多个线程同时读,但写操作独占,适合“读多写少”的场景。核心在于用 readLock() 和 writeLock() 分别获取读锁和写锁,并严格配对 lock()/unlock()。
读锁与写锁的基本用法
读锁可重入、共享;写锁可重入、互斥,且写锁优先级高于读锁(即写锁等待时,新读锁会被阻塞)。使用时必须确保每个 lock() 都有对应 unlock(),推荐用 try-finally 保证释放:
- 读操作:调用 readLock().lock() → 执行读逻辑 → readLock().unlock()
- 写操作:调用 writeLock().lock() → 执行写逻辑(含修改、插入、删除)→ writeLock().unlock()
- 不要在持有读锁时直接升级为写锁(会死锁),需先释放读锁再获取写锁
典型应用场景示例
比如缓存类中维护一个 HashMap,读取频繁、更新较少:
- get(key) 方法用 readLock:多个线程可并发读,不阻塞
- put(key, value) 或 clear() 方法用 writeLock:写时阻塞所有读和写
- 注意:不能在 readLock 持有期间调用 writeLock.lock(),否则当前线程会一直等待自己释放读锁
常见陷阱与注意事项
实际使用容易忽略的细节:
- 锁未释放导致线程阻塞:务必在 finally 块中 unlock,尤其读锁被大量请求时漏释放会拖垮性能
- 锁降级可行,升级不可行:可先获取写锁,再获取读锁,最后释放写锁(保持读锁),实现“写后立即读”;但反过来会死锁
- 公平性选择:构造时传 true 可启用公平模式(按等待顺序分配锁),默认非公平,吞吐更高但可能饥饿
- 不支持条件变量混用:ReadLock 和 WriteLock 各自拥有独立的 newCondition(),不能跨锁使用
简单代码片段示意
以下是一个线程安全的计数器实现:
private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
private int count = 0;
public int getCount() {
lock.readLock().lock();
try {
return count;
} finally {
lock.readLock().unlock();
}
}
public void increment() {
lock.writeLock().lock();
try {
count++;
} finally {
lock.writeLock().unlock();
}
}
这种写法避免了 synchronized 的全局互斥,读操作无需串行化,显著提升并发读性能。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











