视频课程
小黑屋思过中,禁止观看!
评论并刷新后可见

您需要在视频最下面评论并刷新后,方可查看完整视频

视频课程
立即观看
付费视频

您支付费用,方可查看完整视频

¥{{user.role.value}}
课程视频
开始学习
会员专享

视频合集

深入ReentrantReadWriteLock的实现原理

  • 课程笔记
  • 问答交流

大家都知道 SynchronizedReentrantLock 都是独占锁,即在同一时刻只有一个线程获取到锁。

然而在有些业务场景中,我们大多在读取数据,很少写入数据,这种情况下,如果仍使用独占锁,效率将及其低下。

针对这种情况,Java提供了读写锁——ReentrantReadWriteLock。

有点类似MySQL数据库为代表的读写分离机制,既然我们知道了读写锁是用于读多写少的场景。那问题来了,ReentrantReadWriteLock是怎样来实现的呢,它与ReentrantLock的实现又有什么的区别呢?

为了助大家掌握好ReentrantReadWriteLock,本节课我会重点讲解以下5点:

1.ReentrantReadWriteLock简介

2.ReentrantReadWriteLock特性

3.ReentrantReadWriteLock的主要成员

4.ReentrantReadWriteLock的实现原理

5.ReentrantReadWriteLock获取写和读锁的实现

ReentrantReadWriteLock简介

很多情况下有这样一种场景:对共享资源有读和写的操作,且写操作没有读操作那么频繁。

在没有写操作的时候,多个线程同时读一个资源没有任何问题,所以应该允许多个线程同时读取共享资源,但是如果一个线程想去写这些共享资源,就不应该允许其他线程对该资源进行读和写的操作了。

针对这种场景,JAVA的并发包提供了读写锁ReentrantReadWriteLock,它表示两个锁,一个是读操作相关的锁,称为共享锁;一个是写相关的锁,称为排他锁。

ReentrantReadWriteLock特性

  • 公平性:读写锁支持非公平和公平的锁获取方式,非公平锁的吞吐量优于公平锁的吞吐量,默认构造的是非公平锁
  • 可重入:在线程获取读锁之后能够再次获取读锁,但是不能获取写锁,而线程在获取写锁之后能够再次获取写锁,同时也能获取读锁
  • 锁降级:线程获取写锁之后获取读锁,再释放写锁,这样实现了写锁变为读锁,也叫锁降级

ReentrantReadWriteLock的主要成员和结构图

1. ReentrantReadWriteLock的继承关系
深入ReentrantReadWriteLock的实现原理-mikechen

public interface ReadWriteLock {
    /**
     * Returns the lock used for reading.
     *
     * @return the lock used for reading.
     */
    Lock readLock();
    /**
     * Returns the lock used for writing.
     *
     * @return the lock used for writing.
     */
    Lock writeLock();
}

读写锁 ReadWriteLock
读写锁维护了一对相关的锁,一个用于只读操作,一个用于写入操作。
只要没有写入,读取锁可以由多个读线程同时保持,写入锁是独占的。

2.ReentrantReadWriteLock的核心变量

 

评论交流
  1. JansenZhang

    可重入读写锁在可重入锁的基础上扩展了读写分离的功能。在读写锁中,可以根据读和写来选择性的使用锁,读锁是共享锁,支持多个线程同时访问,所以效率比可重入锁更高;写锁和可重入锁一样是独占锁支持可重入。
    另外,写锁可降级为读锁,保证了线程安全的基础上也提高了效率。

  2. 路正银

    ReentrantLock是独占锁,在同一时刻只有一个线程可以获取到锁
    ReentrantReadWriteLock是两个锁,一个是读操作相关的锁,称为共享锁,一个是写相关的锁,称为排它锁;只要没有写入,读取锁可以由多个线程同时保持,写入锁是独占的。
    在读多写少的业务场景之下,ReentrantReadWriteLock的效率,远远高于ReentrantLock。

    • mikechen

      回答正确,路正银,剩下我就给你加油了,只要你保持这个学习状态与作业输出,3个月后你将见证你自己的直线成长路线 ✗咧嘴笑✗ ✗拳头✗