读写锁允许多线程并发读、独占写,提升“读多写少”场景性能;Java通过ReentrantReadWriteLock实现,支持重入与锁降级,需注意写饥饿与正确释放。
Java读写锁是一种特殊的锁机制,用于控制对共享资源的并发访问。它的核心思想是:当多个线程只进行读操作时,可以同时进行,不互相阻塞;但只要有一个线程需要写操作,就必须独占资源,其他读和写都必须等待。
这种机制提升了并发性能,特别适用于“读多写少”的场景。
读写锁的基本原理
读写锁将锁分为两种模式:
- 读锁(Read Lock):允许多个线程同时获取,适用于只读操作。只要没有线程持有写锁,读锁就可以被多个线程获得。
- 写锁(Write Lock):是独占锁,同一时间只能被一个线程持有。在写锁被占用期间,其他任何线程(包括读线程)都不能获取锁。
这样设计的好处是,在高并发读取数据时不会因为互斥而降低效率,只有在修改数据时才进行严格同步。
Java中的实现:ReentrantReadWriteLock
Java 提供了 java.util.concurrent.locks.ReentrantReadWriteLock 类来实现读写锁。它支持可重入性,即同一个线程可以多次获取读锁或写锁(在写锁的情况下)。
基本使用方式如下:
- 通过
readLock()方法获取读锁。 - 通过
writeLock()方法获取写锁。 - 必须手动释放锁,通常放在 finally 块中。
示例代码:
ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock(); Lock readLock = rwLock.readLock(); Lock writeLock = rwLock.writeLock(); // 读操作 readLock.lock(); try { // 安全地读取共享资源 } finally { readLock.unlock(); } // 写操作 writeLock.lock(); try { // 修改共享资源 } finally { writeLock.unlock(); }
适用场景与注意事项
读写锁适合以下情况:
- 共享数据被频繁读取,但很少修改。
- 读操作耗时较长,希望提高并发吞吐量。
需要注意的问题:
- 写锁饥饿问题:如果读线程持续不断进入,可能导致写线程长时间无法获取锁。可以通过公平锁策略缓解。
- 锁降级:允许从写锁降级为读锁(先持有写锁,再获取读锁,最后释放写锁),但不能升级(持有读锁再去获取写锁会死锁)。
- 重入性规则:同一线程可重复获取对应类型的锁,但要注意配对释放。

iteLock();
// 读操作
readLock.lock();
try {
// 安全地读取共享资源
} finally {
readLock.unlock();
}
// 写操作
writeLock.lock();
try {
// 修改共享资源
} finally {
writeLock.unlock();
}







