AQS抽象队列同步器

简介: AQS抽象队列同步器

AQS是什么


抽象的队列同步器

1673419989019.jpg

AbstractOwnableSynchronizer

AbstractQueuedLongSynchronizer

AbstractQueuedSynchronizer 通常地:AbstractQueuedSynchronizer简称为AQS


解释:


是用来构建锁或者其它同步器组件的重量级基础框架及整个JUC体系的基石,

通过内置的FIFO队列来完成资源获取线程的排队工作,并通过一个int类变量表示持有锁的状态

1673419999072.jpg

CLH:Craig、Landin and Hagersten 队列,是一个单向链表,AQS中的队列是CLH变体的虚拟双向队列FIFO


AQS为什么是JUC内容中最重要的基石


1673420031186.jpg


锁和同步器的关系


锁,面向锁的使用者:定义了程序员和锁交互的使用层API,隐藏了实现细节,你调用即可。


同步器,面向锁的实现者:比如Java并发大神DougLee,提出统一规范并简化了锁的实现,屏蔽了同步状态管理、阻塞线程排队和通知、唤醒机制等。


作用


加锁会导致阻塞,有阻塞就需要排队,实现排队必然需要队列


抢到资源的线程直接使用处理业务,抢不到资源的必然涉及一种排队等候机制。抢占资源失败的线程继续去等待(类似银行业务办理窗口都满了,暂时没有受理窗口的顾客只能去候客区排队等候),但等候线程仍然保留获取锁的可能且获取锁流程仍在继续(候客区的顾客也在等着叫号,轮到了再去受理窗口办理业务)。


既然说到了排队等候机制,那么就一定会有某种队列形成,这样的队列是什么数据结构呢?


如果共享资源被占用,就需要一定的阻塞等待唤醒机制来保证锁分配。这个机制主要用的是CLH队列的变体实现的,将暂时获取不到锁的线程加入到队列中,这个队列就是AQS的抽象表现。它将请求共享资源的线程封装成队列的结点(Node),通过CAS、自旋以及LockSupport.park()的方式,维护state变量的状态,使并发达到同步的效果。

1673420053366.jpg


AQS初步


AQS初识


有阻塞就需要排队,实现排队必然需要队列


AQS使用一个volatile的int类型的成员变量来表示同步状态,通过内置的FIFO队列来完成资源获取的排队工作将每条要去抢占资源的线程封装成一个Node节点来实现锁的分配,通过CAS完成对State值的修改。

1673420089613.jpg


AQS内部体系架构

1673420108470.jpg

1673420119947.jpg

AQS同步队列的基本结构


1673420153733.jpg


CLH:Craig、Landin and Hagersten 队列,是个单向链表,AQS中的队列是CLH变体的虚拟双向队列(FIFO)


从ReentrantLock解读AQS


Lock接口的实现类,基本都是通过【聚合】了一个【队列同步器】的子类完成线程访问控制的


ReentrantLock的原理

1673420196414.jpg


从最简单的lock方法开始看看公平和非公平

1673420298967.jpg

1673420306276.jpg

1673420314207.jpg

可以明显看出公平锁与非公平锁的lock()方法唯一的区别就在于公平锁在获取同步状态时多了一个限制条件:hasQueuedPredecessors()

hasQueuedPredecessors是公平锁加锁时判断等待队列中是否存在有效节点的方法


非公平锁,方法lock()


对比公平锁和非公平锁的 tryAcquire()方法的实现代码,其实差别就在于非公平锁获取锁时比公平锁中少了一个判断 !hasQueuedPredecessors()


hasQueuedPredecessors() 中判断了是否需要排队,导致公平锁和非公平锁的差异如下:


公平锁:公平锁讲究先来先到,线程在获取锁时,如果这个锁的等待队列中已经有线程在等待,那么当前线程就会进入等待队列中;


非公平锁:不管是否有等待队列,如果可以获取锁,则立刻占有锁对象。也就是说队列的第一个排队线程在unpark(),之后还是需要竞争锁(存在线程竞争的情况下)

1673419948883.jpg

相关文章
|
8月前
|
存储 Java
AQS(AbstractQueuedSynchronizer,队列同步器)源码解读
AQS(AbstractQueuedSynchronizer,队列同步器)源码解读
|
人工智能 算法
同步器的介绍
一、同步器的基本原理 同步器是一种电子电路,用于同的电子信号进行同步。它的基本原理是根据输入信号的特征,通过适当的控制和调节,使输出信号与输入信号保持同步。同步器通常由触发器、计数器、时钟等组成,通过这些元件的协同工作,实现信号的同步和精确控制。 二、同步器的应用领域 同步器在各个领域都有广泛的应用。在通信领域,同步器用于确保数据传输的准确性和稳定性。在计算机领域,同步器用于控制和同步各个部件的工作,保证计算机系统的正常运行。在音视频领域,同步器用于音频和视频信号的同步播放,提供更好的观看和听觉体验。在工业自动化领域,同步器用于控制和同步各个机械设备的运行,提高生产效率和精确度。 三、同步器的
199 0
|
安全 Java
【深入理解同步器AQS】
【深入理解同步器AQS】
130 0
|
7月前
|
消息中间件 设计模式 安全
深入理解AQS队列同步器原理-从ReentrantLock的非公平独占锁实现来看AQS的原理
深入理解AQS队列同步器原理-从ReentrantLock的非公平独占锁实现来看AQS的原理
|
8月前
|
Java
JAVA AQS 抽象队列同步器
在 AQS(AbstractQueuedSynchronizer)中,可以通过一些机制来实现共享锁。AQS是Java并发包中的一个基础框架,它提供了一种用于构建锁和同步器的工具。
|
8月前
|
存储 设计模式 算法
队列同步器AQS-AbstractQueuedSynchronizer 原理分析
队列同步器AQS-AbstractQueuedSynchronizer 原理分析
107 0
|
Java 程序员 API
AQS 原理解读
AQS 原理解读
|
Java 调度 容器
并发编程-15并发容器(J.U.C)核心 AbstractQueuedSynchronizer 抽象队列同步器AQS介绍
并发编程-15并发容器(J.U.C)核心 AbstractQueuedSynchronizer 抽象队列同步器AQS介绍
121 0
|
机器学习/深度学习 Java 调度
浅谈AQS原理
经典八股文之AQS原理
206 0