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

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

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

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

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

视频合集

深入ReentrantLock实现原理,源码深度剖析!

  • 课程笔记
  • 问答交流

ReentrantLock是java中非常重要的一个并发工具,想掌握好ReentrantLock,首选需要掌握好AQS,AQS是Java并发包中众多同步组件的构建基石。

接下来我将详解ReentrantLock的核心实现,我将从ReentrantLock成员结构,再到详细的锁获取细节来详解ReentrantLock,文末有ReentrantLock的大厂面试必考题作业。

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

1.AQS

2.ReentrantLock简介

3.ReentrantLock的主要成员和结构图

4.ReentrantLock的基本使用

5.ReentrantLock的实现原理

6.ReentrantLock锁源码剖析

AQS

AQS全名:AbstractQueuedSynchronizer,是并发容器J.U.C(java.lang.concurrent)下locks包内的一个类,它实现了一个FIFO(FirstIn、FisrtOut先进先出)的队列,底层实现的数据结构是一个双向链表。

深入ReentrantLock实现原理,源码深度剖析!-mikechen

AQS定义了一套多线程访问共享资源的同步器框架,在Lock包许多同步类实现都依赖于它,如常用的:

  • 锁(ReentrantLock)
  • 门阀(CountDownLatch)
  • 信号量(Semaphor)
  • 读写锁(ReadWriteLock)

这些类里面都维护了一套AQS的子类,都是基于AQS来构建。

所以你想掌握好ReentrantLock,你首先需要打好AQS的基础。详细的AQS介绍(点击查看)

ReentrantLock简介

ReentrantLock重入锁,顾名思义,就是支持重入的锁,它表示能够支持一个线程对资源的重复加锁, 是一个基于AQS( )并发框架的并发控制类。

我们之前学习过Synchronized锁,它也是支持重入的一种锁,参考:Java并发编程系列:深入详解Synchronized同步锁的底层实现

ReentrantLock的主要成员和结构图

深入ReentrantLock实现原理,源码深度剖析!-mikechen

 

评论交流
  1. mikechen

    3个问题,都谈到了核心点,继续保持下去,作业输出前用语言来表述,这样的反复训练,学东西会越来越快,因为很简单,直接抓重点学,其实表述的过程就是练习抓重点的过程。后面第3个图:因为经常会问到公平锁与非公平锁的区别,还可以再补充下这个点。

    我这边也在想后续把你们的作业输出集结成册,方便大家看自己的成长记录与学习心得,加油,路正银,后面你会越来越厉害 ✗咧嘴笑✗ ✗拳头✗

  2. 路正银

    问题1、ReentrantLock重入锁,它能够支持一个线程对资源的重复加锁,是一个基于AQS并发框架的并发控制类。
    ReentrantLock的锁主要是以资源state为状态描述,利用CAS实现对锁资源的抢占,并通过一个CLH队列阻塞所有的竞争线程。
    问题2、公平锁的实现是在抢占锁之前先去判断当前线程之前有没有前置等待的线程
    可重入的实现方式是,独占线程和当前线程是同一线程时,state的值+1,线程可以不停的lock来增加state的值,对应的需要unlock来解锁,直到state为零
    问题3

  3. 李鸿翼

    reentrantlock 底层基于AQS,可重入,支持非公平和公平两种模式,默认非公平。

    公平锁是通过把在进行CAS之前,先判断AQS队列中有没有线程,如果没有才会进行CAS来实现的。
    可重入,是通过对状态变量state进行操作来实现,如果同一个线程多次进入,会对state变量多次加1,释放锁,则会减一,直到为0才释放锁。

    流程图后面再补(现在不方便):

    • mikechen

      最近你先忙好家里的事情,后续作业再补也来得及 ✗拳头✗

  4. JansenZhang

    ReentrantLock是jdk提供的可重入锁,跟synchronized一样,也是为了保证在同一时刻只有一个线程能进入被锁的代码块,从而保证原子性。
    ReentrantLock是基于AQS实现的锁,通过state来标记锁的状态,使用CLH队列来实现线程等待。当线程获取锁的时候,获取成功则执行代码,如果获取锁失败则会将当前线程组装到一个Node节点中,然后添加到CLH队尾。
    ReentrantLock的公平锁和非公平锁的区别就是在获取锁的时候,公平锁会判定节点的前面是否还有在等待的线程节点,如果没有再进行CAS操作获取锁;而非公平锁则不会判断前面是否有等待节点直接进行CAS操作。
    ReentrantLock的可重入实现是在获取锁的时候,如果发现锁的状态是有锁,则判断当前锁的线程是否和当前线程是同一线程,如果是,则将state+1,当前线程获得锁成功。同理,在解锁时,必须要state=0才解锁成功。