Java 读写锁(ReadWriteLock)

说明:Java 的 ReadWriteLockJVM 级别的并发控制工具,与数据库完全无关。它属于 java.util.concurrent.locks 包,用于在单进程内实现细粒度的读写分离控制。

ReadWriteLock 接口概述

ReadWriteLock 是 Java 并发包提供的接口,定义了一对锁:

  • 读锁(共享锁):多个线程可同时获取,适合读多写少场景
  • 写锁(排他锁):同一时间只能被一个线程持有

核心特性

  • 读写分离:读操作不阻塞其他读操作,提高并发读性能
  • 写优先/读优先:不同实现有不同的锁获取策略
  • 可重入性ReentrantReadWriteLock 支持锁的重入

Java 读写锁实现

import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
 
public class Cache {
    private final ReadWriteLock rwLock = new ReentrantReadWriteLock();
    private Map<String, Object> cache = new HashMap<>();
    
    public Object get(String key) {
        rwLock.readLock().lock();
        try {
            return cache.get(key);
        } finally {
            rwLock.readLock().unlock();
        }
    }
    
    public void put(String key, Object value) {
        rwLock.writeLock().lock();
        try {
            cache.put(key, value);
        } finally {
            rwLock.writeLock().unlock();
        }
    }
}

读写锁特性

场景读锁写锁
多个读锁允许阻塞
读锁+写锁阻塞阻塞
多个写锁阻塞阻塞

与其他锁机制对比

锁类型实现方式并发性能适用场景
悲观锁SELECT FOR UPDATE写多读少、库存扣减
乐观锁版本号/CAS读多写少、普通更新
读写锁ReadWriteLock中高缓存读写分离
分布式锁Redis/ZK跨进程/跨机器

参考链接