前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ReentrantReadWriteLock知识点梳理

ReentrantReadWriteLock知识点梳理

作者头像
微观技术
发布2020-08-19 17:02:09
3060
发布2020-08-19 17:02:09
举报
文章被收录于专栏:微观技术微观技术

接下来几篇文章会对JUC并发包里面的锁工具类做下梳理,如:ReentrantLock、

ReentrantReadWriteLock、StampedLock

一、基本信息

ReentrantLock是一个排他锁,同一时刻只允许一个线程访问,对于读多写少场景存在很大浪费。

ReentrantReadWriteLock允许多个读线程同时访问,但不允许写线程和读线程、写线程和写线程同时访问。相对于排他锁,提高了并发性。在实际应用中,大部分情况下对共享数据(如缓存)的访问都是读操作远多于写操作,这时ReentrantReadWriteLock能够提供比排他锁更好的并发性和吞吐量。

读写锁内部维护了两个锁,一个用于读操作,一个用于写操作。所有 ReadWriteLock实现都必须保证 writeLock操作的内存同步效果也要保持与相关 readLock的联系。也就是说,成功获取读锁的线程会看到写入锁之前版本所做的所有更新。

读写锁三条基本原则:

  • 允许多个线程同时读共享变量;
  • 只允许一个线程写共享变量;
  • 如果一个写线程正在执行写操作,此时禁止读线程读共享变量。

读写锁与互斥锁的一个重要区别就是读写锁允许多个线程同时读共享变量,而互斥锁是不允许的,这是读写锁在读多写少场景下性能优于互斥锁的关键。但读写锁的写操作是互斥的,当一个线程在写共享变量的时候,是不允许其他线程执行写操作和读操作。

特性:

  • 支持非公平、公平两种模式,默认非公平
  • 读锁和写锁都实现了 java.util.concurrent.locks.Lock 接口,所以除了支持 lock() 方法外,tryLock()、lockInterruptibly() 等方法也都是支持的
  • 支持可重入性
    • 一个线程在获取了读锁后还可以获取读锁
    • 一个线程在获取了写锁后,可以再次获取写锁也可以获取读锁;
  • 锁降级,允许写锁降级为读锁
    • 其实现方式是:先获取写锁,然后获取读锁,然后释放写锁,业务操作,最后释放读锁
    • 但是,读锁升级到写锁是不允许的;
  • 读锁和写锁都支持锁获取期间的中断;
  • 写锁支持 Condition 条件变量。读取锁不支持 Conditon ,readLock().newCondition() 会抛出 UnsupportedOperationException。
  • 提供很多方法,用于监控,数据采集

锁降级demo:

代码语言:javascript
复制
 class CachedData {
    Object data;
    volatile boolean cacheValid;
    final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
 
    void processCachedData() {
      rwl.readLock().lock();
      if (!cacheValid) {
        // 在获取写锁前,先把读锁释放,因为不允许读锁的升级
        rwl.readLock().unlock();
        rwl.writeLock().lock();
        try {
          // 再次检查状态
          if (!cacheValid) {
            data = ...
            cacheValid = true;
          }
          // 锁降级,在释放写锁前先获取读锁
          rwl.readLock().lock();
        } finally {
          rwl.writeLock().unlock(); // Unlock write, still hold read
        }
      }
 
      try {
        // 业务操作
        use(data);
      } finally {
        // 最后,释放读锁
        rwl.readLock().unlock();
      }
    }
  }
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微观技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、基本信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档