【深入理解AQS与ReentrantLock源码剖析】

一、管程与管程模型

1.1、什么是管程

管程是指管理共享变量与对共享变量操作过程,让其变量支持并发,具有互斥与同步特点,互斥是某一时刻只允许一个线程访问共享变量,同步既是线程之间的通信、协作

1.2、管程模型—MESA模型

在这里插入图片描述

如上图示:当多个线程同时来访问资源时,首先是线程对status值以CAS方式进行更改,例:ReentrantLock中,把status由0改为一,只有一个线程能更改成功,其他为修改成功的线程就需要加入到等待队列=>主要用于维护获取锁失败时入队的线程中,如果是条件的Condition(),当前线程就需要加入到条件队列=>调用await()的时候会释放锁,然后线程会加入到条件队列,调用signal()唤醒的时候会把条件队列中的线程节点移动到同步队列中,等待再次获得锁,满足条件后,通过等待/唤醒通知方式,将满足条件的线程加入上述的等待队列中去竞争锁标记status

二、AQS原理分析

2.1、AQS是什么

AQS其实就是将大部分同步器实现的基础行为抽象出来,比如等待队列、条件队列、独占获取锁、共享获取锁等行为,将这些共同的行为抽象,所以就为==>AbstractQueuedSynchronizer,AQS是一个抽象的同步框架,JDK中大多数的同步器都是基于AQS框架实现
在这里插入图片描述

2.2、AQS具备的特点(可参考上图MESA模型图)

  1. 阻塞的等待队列
  2. 共享/独占方式的获取锁资源
  3. 公平/非公平控制
  4. 可重入
  5. 允许中断

2.3、AQS核心结构

AQS内部维护属性state==>表示资源的可用状态,主要有以下几种访问方式:

  • getState():设置state状态值
  • setState():获取state状态值
  • compareAndSetState():以CAS方式设置state状态值

在访问内部资源时,提供了Exclusive(独占)和Share(共享),两种方式进行资源访问
在这个抽象类中,主要实现了以下方式:

  • tryAcquire(int):以独占的方式获取锁,true表示获取锁成功,反之为失败
  • tryRelease(int):独占方式,释放锁,true为释放成功,false为失败
  • tryAcquireShared(int):以共享的方式获取锁资源,负数表示获取锁失败,大于等于0情况表示获取锁成功,大于0的说明还有剩余的所资源
  • tryReleaseShared(int):共享方式,尝试释放资源,如果释放后允许唤醒后续等待结点返回true,否则返回false

三、ReentrantLock源码分析

3.1、ReentrantLock加锁到释放过程剖析

我们主要通过几个方便对ReentrantLock底层进行剖析,分别是:

  • ReentrantLock对公平锁和非公平锁以及可重入是如何实现的?
  • ReentrantLock在并发场景下入队和出队以及线程状态转变过程是怎样的?
    1、线程竞争锁失败后入队阻塞的实现?
    2、释放锁的线程唤醒阻塞线程出队竞争锁的实现?

3.1.1、ReentrantLock底层对公平锁与非公平锁的实现

如下源码:ReentrantLock加锁操作时,分别有两个方法,分别是公平锁与非公平锁方式
在这里插入图片描述
两个方法的不同点在于:

在这里插入图片描述
在这里插入图片描述

而非公锁是:先尝试的以CAS方式更改state的值,如果更改失败,再调acquire()方法,源码如下图示:
在这里插入图片描述

3.1.2、ReentrantLock底层可重入的实现

在尝试加锁时,也就是调用tryAcquire()方法时,会将当前要加锁的线程与当前持有锁的线程进行比对,如果是同一个,state+1,否则加锁失败,源码如下图示:
在这里插入图片描述

3.1.3、ReentrantLock底层线程竞争锁失败加入队列的实现

若当前竞争锁的线程失败了,会调用acquireQueued方法将线程加入到队列(链表结构)中去,接着会源码如下

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.1.4、ReentrantLock底层线程释放锁唤醒等待队列线程的实现

在线程执行完毕后,会调用release进行锁释放,在释放时:调用unparkSuccessor方法,如下图示:
在这里插入图片描述

在这里插入图片描述

四、ReentrantLock源码剖析案例图

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值