当前位置:网站首页>AQS抽象队列同步器
AQS抽象队列同步器
2022-06-27 14:12:00 【鱼找水需要时间】
AQS是什么
抽象的队列同步器

AbstractOwnableSynchronizer
AbstractQueuedLongSynchronizer
AbstractQueuedSynchronizer 通常地:AbstractQueuedSynchronizer简称为AQS
解释:
是用来构建锁或者其它同步器组件的重量级基础框架及整个JUC体系的基石,
通过内置的FIFO队列来完成资源获取线程的排队工作,并通过一个int类变量表示持有锁的状态

CLH:Craig、Landin and Hagersten 队列,是一个单向链表,AQS中的队列是CLH变体的虚拟双向队列FIFO
AQS为什么是JUC内容中最重要的基石

锁和同步器的关系
锁,面向锁的使用者:定义了程序员和锁交互的使用层API,隐藏了实现细节,你调用即可。
同步器,面向锁的实现者:比如Java并发大神DougLee,提出统一规范并简化了锁的实现,屏蔽了同步状态管理、阻塞线程排队和通知、唤醒机制等。
作用
加锁会导致阻塞,有阻塞就需要排队,实现排队必然需要队列
抢到资源的线程直接使用处理业务,抢不到资源的必然涉及一种排队等候机制。抢占资源失败的线程继续去等待(类似银行业务办理窗口都满了,暂时没有受理窗口的顾客只能去候客区排队等候),但等候线程仍然保留获取锁的可能且获取锁流程仍在继续(候客区的顾客也在等着叫号,轮到了再去受理窗口办理业务)。
既然说到了排队等候机制,那么就一定会有某种队列形成,这样的队列是什么数据结构呢?
如果共享资源被占用,就需要一定的阻塞等待唤醒机制来保证锁分配。这个机制主要用的是CLH队列的变体实现的,将暂时获取不到锁的线程加入到队列中,这个队列就是AQS的抽象表现。它将请求共享资源的线程封装成队列的结点(Node),通过CAS、自旋以及LockSupport.park()的方式,维护state变量的状态,使并发达到同步的效果。

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

AQS内部体系架构


AQS同步队列的基本结构

CLH:Craig、Landin and Hagersten 队列,是个单向链表,AQS中的队列是CLH变体的虚拟双向队列(FIFO)
从ReentrantLock解读AQS
Lock接口的实现类,基本都是通过【聚合】了一个【队列同步器】的子类完成线程访问控制的
ReentrantLock的原理

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



可以明显看出公平锁与非公平锁的lock()方法唯一的区别就在于公平锁在获取同步状态时多了一个限制条件:hasQueuedPredecessors()
hasQueuedPredecessors是公平锁加锁时判断等待队列中是否存在有效节点的方法
非公平锁,方法lock()
对比公平锁和非公平锁的 tryAcquire()方法的实现代码,其实差别就在于非公平锁获取锁时比公平锁中少了一个判断 !hasQueuedPredecessors()
hasQueuedPredecessors() 中判断了是否需要排队,导致公平锁和非公平锁的差异如下:
公平锁:公平锁讲究先来先到,线程在获取锁时,如果这个锁的等待队列中已经有线程在等待,那么当前线程就会进入等待队列中;
非公平锁:不管是否有等待队列,如果可以获取锁,则立刻占有锁对象。也就是说队列的第一个排队线程在unpark(),之后还是需要竞争锁(存在线程竞争的情况下)

边栏推荐
- [business security-02] business data security test and example of commodity order quantity tampering
- 跨境电商多商户系统怎么选
- 【业务安全-04】万能用户名及万能密码实验
- Bidding announcement: Oracle all-in-one machine software and hardware maintenance project of Shanghai R & D Public Service Platform Management Center
- [advanced MySQL] MTS master-slave synchronization principle and Practice Guide (7)
- What if the win system cannot complete the update and is revoking the status change
- Deep understanding of bit operations
- 做一篇人人能搞懂的ThreadLocal(源码)
- Bidding announcement: Oracle database maintenance service procurement of the First Affiliated Hospital of Jinan University
- 外部存储器
猜你喜欢

Calcul de la confidentialité Fate - Prévisions hors ligne

跨境电商多商户系统怎么选

American chips are hit hard again, and another chip enterprise after Intel will be overtaken by Chinese chips
Principle Comparison and analysis of mechanical hard disk and SSD solid state disk

Acwing game 57

美国芯片再遭重击,继Intel后又一家芯片企业将被中国芯片超越

【业务安全03】密码找回业务安全以及接口参数账号修改实例(基于metinfov4.0平台)

Pytoch learning 2 (CNN)

Massive data! Second level analysis! Flink+doris build a real-time data warehouse scheme

CMOS级电路分析
随机推荐
Step by step expansion of variable parameters in class templates
[problem solving] which nodes are run in tensorflow?
图书管理系统
Interpretation of new version features of PostgreSQL 15 (including live Q & A and PPT data summary)
Redis master-slave replication, sentinel mode, cluster cluster
Leetcode 724. Find the central subscript of the array (yes, once)
Shell concise tutorial
How ASP connects Excel
NAACL 2022 | TAMT:通过下游任务无关掩码训练搜索可迁移的BERT子网络
事务的四大特性
CV领域一代宗师黄煦涛教授86岁冥诞,UIUC专设博士奖学金激励新锐
剑指 Offer II 039. 直方图最大矩形面积 单调栈
Bidding announcement: Oracle database maintenance service procurement of the First Affiliated Hospital of Jinan University
Why must Oracle cloud customers self test after the release of Oracle cloud quarterly update?
Kyndryl与Oracle和Veritas达成合作
[business security-02] business data security test and example of commodity order quantity tampering
Naacl 2022 | TAMT: search the transportable Bert subnet through downstream task independent mask training
Design and implementation of food recipe and ingredients website based on vue+node+mysql
AXI總線
跨境电商多商户系统怎么选