AQS原理探究

Posted 若曦`

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AQS原理探究相关的知识,希望对你有一定的参考价值。

(本文中部分图片来自阳哥AQS视频中的截图)

1. AQS简介

AQS全称 AbstractQueuedSynchronizer 抽象队列同步器,是JUC中最重要的基石部分,许多JUC工具包的Sync内部类都继承自AQS,,比如 ReentrantLock,CountDownLatch,Semaphore,CyclicBarrier(内部使用了ReentrantLock)等

一句话总结AQS

AQS就是一个并发包的基础组件,用来实现各种锁,各种同步组件的;它包含了state变量、加锁线程、等待队列等并发中的核心组件;
在这里插入图片描述

2. AQS原理初步探讨

在这里插入图片描述

  • 如果int(state)是0则代表没有资源占用锁,如果是1则有占用;
    在这里插入图片描述
    在这里插入图片描述
    node节点封装thread,实现锁的分配,通过CAS完成去State锁占用情况的修改
    在这里插入图片描述
    在这里插入图片描述
    注意Thread是volatile修饰的

3. 从ReentrantLook解读AQS

(1) ReentrantLook与AQS的关系

在这里插入图片描述
调用ReentrantLock的lock()与unlock()时,实质是调用Sync的方法,如果获取不到锁,则封装成一个node节点存入AQS中

(2) 构造函数

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

(3) lock()方法

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

(4) acquire()方法

① tryAcquire()

该方法是为了一种情况,就是第二个线程没获取到锁的时候,先不急着入队,再使用CAS判断一次线程一是否还在,同时也是实现锁可重入的特性的步骤( 判断进入方法的要获取锁的线程是不是正持有锁的线程,如果是,那么就加重入锁)
在这里插入图片描述

② addWaiter()

在这里插入图片描述
EXCLUSIVE代表排它类型的
在这里插入图片描述
在这里插入图片描述
当等待队列为空时,第一个加入该队列的线程时的结果
在这里插入图片描述
后续再有线程加入队列的情况
在这里插入图片描述

(5) acquireQueued()方法

在这里插入图片描述

① shouldParkAfterFailedAcquire()方法

从名字就可以看出来,翻译为获取失败则应该停下,在该方法中使用了自旋,判断前驱节点的等待状态
在这里插入图片描述

② parkAndCheckInterrupt()

在这里插入图片描述
到这一步后,被阻塞的线程停歇了,乖乖的待在等待队列中。

以上是关于AQS原理探究的主要内容,如果未能解决你的问题,请参考以下文章

AQS原理探究

ReentrantLock原理详解

AQS锁的原理

AQS 原理以及 AQS 同步组件总结

从ReentrantLock的实现看AQS的原理及应用

AQS原理分析