查看完整视频
评论可见

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

积分观看

您支付积分,方可查看完整视频

{{user.role.value}}
付费视频

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

¥{{user.role.value}}
专属视频

只允许以下等级用户查看该视频

升级
会员专享

深入ReentrantLock的实现原理

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

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

我重点会谈到以下6点:

  • AQS
  • ReentrantLock简介
  • ReentrantLock的主要成员和结构图
  • ReentrantLock的基本使用
  • ReentrantLock的实现原理
  • ReentrantLock获取锁的实现

AQS

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

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

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

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

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

隐藏内容,您需要满足以下条件方可查看
End

课后作业

ReentrantLock的大厂面试题来了:

隐藏内容,您需要满足以下条件方可查看
End

请把你的答案写到问答区域,一课一练。(输出是最好的学习:每一次输出都会让你离目标更进一步)

作业输出的数量与质量是大厂内推与福利大奖的唯一凭证!

并发锁

深入ReentrantReadWriteLock的实现原理

2020-7-10 17:08:18

并发锁

Synchronized的源码案例

2020-7-8 16:00:31

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

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

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

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

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

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

    • 老师,这块我是画了两张图的,上传的时候漏传了一张

    • ok ✗咧嘴笑✗

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

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

个人中心
今日签到
搜索