ReentrantReadWriteLock通过分离读写锁提升并发性能,允许多个线程并发读,写操作独占锁;读-读不互斥,读-写和写-写互斥;支持锁降级(先写后读),但不支持锁升级;默认非公平模式,可设为公平模式;使用时需在finally中释放锁,防止死锁。

在Java并发编程中,ReentrantReadWriteLock 是一种常用的同步工具,适用于读多写少的场景。它通过分离读锁和写锁,提高并发性能:多个线程可以同时读取共享资源,但写操作是独占的。
ReentrantReadWriteLock 维护了一对相关的锁:
这种机制保证了:
下面是一个简单的例子,展示如何使用 ReentrantReadWriteLock 来保护一个共享的缓存数据:
立即学习“Java免费学习笔记(深入)”;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class CacheExample {
private final Map<String, Object> cache = new HashMap<>();
private final ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
// 获取读锁进行查询
public Object get(String key) {
rwLock.readLock().lock();
try {
return cache.get(key);
} finally {
rwLock.readLock().unlock();
}
}
// 获取写锁进行更新
public Object put(String key, Object value) {
rwLock.writeLock().lock();
try {
return cache.put(key, value);
} finally {
rwLock.writeLock().unlock();
}
}
// 写操作:清除缓存
public void clear() {
rwLock.writeLock().lock();
try {
cache.clear();
} finally {
rwLock.writeLock().unlock();
}
}
}
在这个例子中:
ReentrantReadWriteLock 支持“锁降级”——即一个线程先获取写锁,再获取读锁,然后释放写锁,从而保持对资源的读权限。这在某些需要原子性更新后立即读取的场景非常有用。
public void processData() {
rwLock.writeLock().lock();
try {
// 修改数据
System.out.println("正在更新数据...");
// 在释放写锁前,先获取读锁(必须当前线程持有写锁)
rwLock.readLock().lock();
} finally {
// 降级的关键:释放写锁,保留读锁
rwLock.writeLock().unlock();
}
try {
// 此时仍持有读锁,可以安全读取
System.out.println("正在读取数据...");
} finally {
rwLock.readLock().unlock();
}
}
注意:不能直接升级(先读再写),否则会导致死锁。
ReentrantReadWriteLock 构造时可指定是否使用公平策略:
// 公平模式 ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock(true);
基本上就这些。合理使用 ReentrantReadWriteLock 能显著提升读多写少场景下的并发效率,但要注意避免锁未释放、错误的锁升级等问题。理解其内部状态机制和使用限制,才能写出高效又安全的并发代码。
以上就是Java里如何使用ReentrantReadWriteLock实现读写锁_ReentrantReadWriteLock操作解析的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号