ReentrantReadWriteLock读写锁底层实现、StampLock详解

本文详细介绍了Java中的ReentrantReadWriteLock和StampedLock。ReentrantReadWriteLock适用于读多写少的场景,其读锁与写锁通过高低位方式实现状态,支持锁降级但不支持锁升级。文章还探讨了StampedLock,它提供了乐观读模式,提高了并发性能,但写锁不支持可重入,且悲观读和写锁不支持条件变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

读写锁、StampLock详解

ReentrantReadWriteLock

简介

适用于读多写少的场景,特点是读读不互斥,读写与写写互斥。



基本使用

private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
private Lock r = readWriteLock.readLock();
private Lock w = readWriteLock.writeLock();

// 读操作上读锁
public Data get(String key) {
   
   
  r.lock();
  try {
   
    
      // TODO 业务逻辑
  }finally {
   
    
       r.unlock(); 
   }
}

// 写操作上写锁
public Data put(String key, Data value) {
   
   
  w.lock();
  try {
   
    
      // TODO 业务逻辑
  }finally {
   
    
       w.unlock(); 
   }
}



整体结构

读写锁有一个顶层规范接口ReadWriteLock

public interface ReadWriteLock {
   
   

    Lock readLock();

    Lock writeLock();
}

我们常用的ReentrantReadWriteLock,它就实现了ReadWriteLock接口,并创建了两个内部类分别代表读锁和写锁。同时还有公平锁与非公平锁

public class ReentrantReadWriteLock implements ReadWriteLock, java.io.Serializable {
   
   
    private static final long serialVersionUID = -6992448646407690164L;
    
    /** 读锁 */
    private final ReentrantReadWriteLock.ReadLock readerLock;
    /** 写锁 */
    private final ReentrantReadWriteLock.WriteLock writerLock;
    /** 同步器 同时还定义了三个内部类,用来满足公平锁与非公平锁的实现*/
    final Sync sync;

    public ReentrantReadWriteLock() {
   
   
        this(false);
    }

    public ReentrantReadWriteLock(boolean fair) {
   
   
        // 同步器 公平锁与非公平锁
        // 这里先创建好了sync对象,然后再传给读写锁,为读写锁中的sync属性赋值
        sync = fair ? new FairSync() : new NonfairSync();
        // 读写锁
        readerLock = new ReadLock(this);
        writerLock = new WriteLock(this);
    }

    // 实现ReadWriteLock接口,重写的两个方法
    public ReentrantReadWriteLock.WriteLock writeLock() {
   
    return writerLock; }
    public ReentrantReadWriteLock.ReadLock  readLock()  {
   
    return readerLock; }
    
    ......
}



ReentrantReadWriteLock结构如下图所示,定义了五个内部类

在这里插入图片描述



读锁与写锁

Sync类继承了AbstractQueuedSynchronizer类,而公平锁与非公平锁的两个类继承了Sync

而读锁与写锁则是实现了Lock接口

读锁:

// 读锁实现了Lock接口,也就是实现接口中的抽象方法。在加锁与解锁的时候就是调用同步器中对共享锁操作的方法
public static class ReadLock implements Lock, java.io.Serializable 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值