当前位置:网站首页>AQS的初步了解
AQS的初步了解
2022-06-22 10:32:00 【IT盛夏的果实】
目录
1 什么是AQS
AQS(AbstractQueuedSynchronizer): 是jdk提供的一个同步框架,内部维护着FIFO双向队列,即CLH同步队列。
AQS依赖它来完成同步状态的管理(volatile修饰的state,用于标志是否持有锁)。如果获取同步状态state失败时,会将当前线程和等待信息构建成一个Node节点。将Node放到FIFO队列中,同时阻塞当前线程,当前线程同步状态state释放时,会把FIFO队列中的首节点唤醒,使其获取同步状态state。
/**
* The synchronization state.
*/
private volatile int state;
注意:java并发包下有很多API都是基于AQS来实现加锁和解锁释放锁的功能的,AQS是java并发包的基础类,像ReentrantLock、ReentrantReadWriteLock底层都是基于AQS来实现的。
2 ReentrantLock加锁和释放锁的底层原理
给大家画一张图,可以让大家更好的理解AQS和ReentrantLock的关系。

如图所示:ReentrantLock(还是JUC类中一些其他的并发类)中包含了AQS,ReentrantLock的加锁和解锁的功能就是依靠AQS来实现的。

假如此时有一个线程来用ReentrantLock进行lock()加锁。AOS内部有一个核心变量叫做state,并且用volatile修饰,初始值为0,并且AQS内部还有一个关键变量,用来记录当前加锁的是哪个线程,初始状态下,这个变量值null。
1)首先会用CAS操作将state从0变为1
注意:如果之前没有线程加过锁,才会加锁成功。否则会加锁失败,然后失败线程进入队列。
2)加锁线程会记录下当前线程的名字

但是ReentrantLock是一个可重入锁,就是对于同一线程,可以进行多次加锁(必须是同一线程)。
如果线程1可重入加锁几次,会先判断一下当前线程是不是自己,那么state就会进行相应的累加,其它的不变。
但是此时又来了一个线程2怎么办呢?

此时如果来了一个线程2,发现state的状态不是0,线程1目前还没释放锁,state的状态依然是1。那么线程2的CAS失败会将自己放入等待队列。
总结:AQS的功能主要分为两类:独占和共享。它的所有子类中要么实现并使用了它的独占功能的API,要么使用了共享锁的功能。而不会同时使用两套API,即便是最有名的子类ReentrantReadWriteLock也是通过两个内部类读锁和写锁分别实现了两套api来实现的。
边栏推荐
- The ruby code in logstash converts the @timestamp timestamp format
- 中信证券app叫什么?股票开户安全吗?
- TikTok 宣布将数据存储于 Oracle 服务器!
- 被曝泄露超 1.7 亿条隐私数据,学习通回应:尚未发现明确证据
- Tiktok announces data storage on Oracle server!
- 传iPhone 14将全系涨价;TikTok美国用户数据转移到甲骨文,字节无法访问;SeaTunnel 2.1.2发布|极客头条...
- Signal integrity (SI) power integrity (PI) learning notes (XXIV) differential pair and differential impedance (IV)
- Target detection / segmentation training using pytorch mask RCNN
- Niuke.com Huawei question bank (31~40)
- 科研奖励,创业奖励评定
猜你喜欢

批量创建/删除文件、文件夹、修改文件名 后缀名

Pytoch realizes wave impedance inversion

2022年深入推进IPv6部署和应用,该如何全面实现安全升级改造?

Tiktok practice ~ one click registration and login process of mobile phone number (verification code)

Cache penetration tool "Bloom filter"

等重构完这系统,我就提离职!

Start from the principle of MVC and knock on an MVC framework to bring you the pleasure of being a great God

Cobalt Strike 从入门到入狱(三)

社区文章|MOSN 构建 Subset 优化思路分享

字节二面:Redis主节点的Key已过期,但从节点依然读到过期数据是为什么?怎么解决?
随机推荐
php 数据库 mysql提问
Quickly master asp Net authentication framework identity - login and logout
xlrd.biffh.XLRDError: Excel xlsx file; not supported 解决办法
追更这个做嵌入式的大佬
数据库课程虚拟教研室负责人杜小勇:立足国产数据库重大需求,探索课程体系建设新模式
2022-06-09 工作记录--yarn/npm-Error-EPERM: operation not permitted, uv_cwd
软件项目管理 8.3.敏捷项目质量活动
工作中的帕累托定律:关注结果,而不是输出
【Shell】常用指令集锦
字节三面:到底知不知道什么是Eureka?
HMS Core新闻行业解决方案:让技术加上人文的温度
[untitled] repair log
加密市场暴跌,stETH引发新一轮担忧
儋州清洁级动物实验室建设细节说明
如何进行高效简洁的电子文档管理
【JMeter】JMeter如何模拟不同的网络速度
【毕业季·进击的技术er】青春不散场
使用的软件是php mysql 数据库
[LineCTF2022]BB
Pareto's law at work: focus on results, not outputs