文章目录
一、引言
在Java并发编程中,读写锁(ReadWriteLock)是一种重要的同步机制,它允许多个线程同时读取共享资源,但在写入时需要独占访问。这种机制在读多写少的场景下能显著提高系统性能。
二、ReadWriteLock基本概念
ReadWriteLock提供了两种类型的锁:读锁(共享锁)和写锁(独占锁)。多个线程可以同时持有读锁,但写锁是互斥的。
下面是一个基本示例:
public class ReadWriteLockBasics {
private final ReadWriteLock rwLock = new ReentrantReadWriteLock();
private final Lock readLock = rwLock.readLock();
private final Lock writeLock = rwLock.writeLock();
private final Map<String, String> data = new HashMap<>();
public String read(String key) {
readLock.lock();
try {
// 模拟读取操作耗时
Thread.sleep(100);
return data.get(key);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return null;
} finally {
readLock.unlock();
}
}
public void write(String key, String value) {
writeLock.lock();
try {
// 模拟写入操作耗时
Thread.sleep(200);
data.put(key, value);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
writeLock.unlock();
}
}
}
三、高级特性实现
3.1 锁降级
锁降级是读写锁的一个重要特性,它允许持有写锁的线程在不释放写锁的情况下获取读锁:
public class LockDowngradeExample {
private final ReadWriteLock rwLock = new ReentrantReadWriteLock();
private final Lock readLock = rwLock.readLock();
private final Lock writeLock = rwLock.writeLock();
private volatile String data;
private volatile boolean dataValid;
public String processData() {
writeLock.lock(); // 获取写锁
try {
if (!dataValid) {
data = loadUpdatedData(); // 更新数据
dataValid = true;
}
readLock.lock(); // 在释放写锁之前获取读锁
try {
writeLock.unlock(); // 释放写锁但保持读锁
return processDataWithReadLock(); // 使用读锁处理数据
} finally {
readLock.unlock(); // 最后释放读锁
}
} finally {
if (writeLock.tryLock()) {
// 检查写锁是否仍被持有
writeLock.unlock();
}
}
}
private String loadUpdatedData() {
// 模拟加载新数据
return "Updated Data " + System.currentTimeMillis();
}
private String processDataWithReadLock() {
// 使用读锁处理数据
return data.toUpperCase