读写锁
读写锁在同一时刻允许多个读线程访问,其他写线程阻塞;在写线程访问时,所有的读线程和其他写线程都被阻塞。
读写锁维护了一对锁,一个读锁,一个写锁,通过分离读锁和写锁,使得并发性比一般的排它锁(独占锁)有了很大提升。Java提供的读写锁是ReentrantReadWriteLock。
ReentrantReadWriteLock的特性
特性 | 说明 |
---|---|
公平性选择 | 支持非公平(默认)和公平的锁获取方式,吞吐量方面非公平优于公平 |
重进入 | 该锁支持重进入,以读写线程为例: 读线程在获取了读锁之后,能够再次获取读锁。 而写线程在获取了写锁之后能够再次获取写锁,同时也可以获取读锁 |
锁降级 | 遵循获取写锁、获取读锁再释放写锁的次序,写锁能够降级成为读锁 |
读写锁的接口与示例
ReentrantReadWriteLock实现了ReadWriteLock接口,该接口只有两个方法
- Lock readLock();
- Lock writeLock();
除了接口方法,ReentrantReadWriteLock还提供了便于外界监控内部工作状态的方法:
读写锁使用示例:
public class TestReadWriteLock {
private static Map<String,Object> map = new HashMap<String,Object>();
private static ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
private static Lock r = rwl.readLock();
private static Lock w = rwl.writeLock();
// 对于元素获取,使用读锁,允许多个线程并发读
public static final Object get(String key){
w.lock();
try {
return map.get(key