当前位置:网站首页>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(),之后还是需要竞争锁(存在线程竞争的情况下)

边栏推荐
- CV领域一代宗师黄煦涛教授86岁冥诞,UIUC专设博士奖学金激励新锐
- 基于WEB平台的阅读APP设计与实现
- Interpretation of new version features of PostgreSQL 15 (including live Q & A and PPT data summary)
- R language objects are stored in JSON
- Type 'image' is not a subtype of type 'imageprovider < object > solution
- Pycharm安装与设置
- 隐私计算FATE-离线预测
- NLP - monocleaner
- Openssf security plan: SBOM will drive software supply chain security
- Reflection learning summary
猜你喜欢

AcWing 第57 场周赛

Redis master-slave replication, sentinel mode, cluster cluster

全球芯片市场或陷入停滞,中国芯片逆势扩张加速提升自给率

LVI: feature extraction and sorting of lidar subsystem

反射学习总结

Completely solve the problem of Chinese garbled code in Web Engineering at one time

Axi bus

以前国产手机高傲定价扬言消费者爱买不买,现在猛降两千求售

How to solve the problem of missing language bar in win10 system

Debug tool
随机推荐
Kyndryl partnered with Oracle and Veritas
In the past, domestic mobile phones were arrogant in pricing and threatened that consumers would like to buy or not, but now they have plummeted by 2000 for sale
Acwing game 57
[PHP code injection] common injectable functions of PHP language and utilization examples of PHP code injection vulnerabilities
现在开户有优惠吗?网上开户是否安全么?
How to select cross-border e-commerce multi merchant system
机械硬盘和ssd固态硬盘的原理对比分析
赛迪顾问发布《“十四五” 关键应用领域之数据库市场研究报告》(附下载)
Half find (half find)
[microservices sentinel] hotspot rules | authorization rules | cluster flow control | machine list
每日3题(2):检查二进制字符串字段
Summary and Thinking on interface test automation
招标公告:上海市研发公共服务平台管理中心Oracle一体机软硬件维保项目
Make a ThreadLocal (source code) that everyone can understand
剑指 Offer II 039. 直方图最大矩形面积 单调栈
Redis持久化
Openssf security plan: SBOM will drive software supply chain security
Multithreading Basics (III)
AXI总线
Naacl 2022 | TAMT: search the transportable Bert subnet through downstream task independent mask training