读写锁

使用场景

读多写少,如缓存等。

原则

  1. 允许多个线程同时读共享变量;
  2. 同一时间只允许一个线程写共享变量;
  3. 如果一个写线程正在执行写操作,禁止所有的读操作

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 条件变量,读锁不支持。