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原理探究

Java并发包基石-AQS详解

Java并发包基石-AQS详解

Java并发包基石-AQS详解

并发编程的基石——AQS类

(转)Java并发包基石-AQS详解