读写锁
使用场景
读多写少,如缓存等。
原则
- 允许多个线程同时读共享变量;
- 同一时间只允许一个线程写共享变量;
- 如果一个写线程正在执行写操作,禁止所有的读操作
Java实现
ReentrantReadWriteLock
实现类,实现ReadWriteLock
接口。
class Cache<K, V> {
final Map<K, V> m = new HashMap<>();
final ReadWriteLock rwl = new ReentrantReadWriteLock();
final Lock r = rwl.readLock();
final Lock w = rwl.writeLock();
V get(K key) {
r.lock();
try {
return m.get(key);
} finally {
r.unlock();
}
}
V put(K key, V value) {
w.lock();
try {
return m.put(key, value);
} finally {
w.unlock();
}
}
}
只有写锁支持 condition 条件变量,读锁不支持。