深入理解AQS
前言
AQS,英文全称叫 AbstractQueueSynchronizer,中文全称叫抽象队列同步器
一、先从字节跳动及其他大厂面试题说起
二、前置知识
2.1 公平锁和非公平锁
2.2 可重入锁
2.3 LockSupport
2.4 自旋锁
2.5 数据结构之链表
2.6 设计模式之模板设计模式
三、是什么
3.1 字面意思
3.1.1 抽象的队列同步器
3.1.2 源码
3.2 技术解释
是用来构建锁或者其他同步器组件的重量级基础框架及整个JUC体系的基石,通过一个FIFO队列来完成资源获取线程的排队工作,并通过一个int类型的变量来表示持有锁的状态(0表示当前暂没有线程持有这把锁,反之,大于0则表示有线程持有这把锁)
四、AQS为什么是JUC内容中最重要的基石
4.1 和AQS有关的
- ReentrantLock
- CountDownLatch
- ReentrantReadWriteLock
- Semaphore
4.2 进一步理解锁和同步器的关系
4.2.1 锁
面向锁的使用者,定义了锁与程序员进行交互的API
4.2.2 同步器
面向锁的实现者,比如Java并发大神DougLea,提出统一规范并简化了锁的实现、屏蔽了同步状态管理、阻塞线程排队与通知、唤醒机制等
五、能干吗
5.1 加锁就会导致阻塞
有阻塞就需要排队,实现排队就必然需要某种队列来进行管理
5.2 解释说明
六、AQS初步
6.1 AQS初识
6.1.1 官网解释
6.1.2 有阻塞就需要排队,实现排队必然需要队列
AQS使用一个volatile的int类型的成员变量来表示同步状态,通过内置的FIFO队列来完成资源获取的排队工作将每条要去抢占资源的线程封装成一个Node节点来实现锁的分配,通过CAS完成对State值的修改
6.2 AQS内部体系架构
6.2.1 AQS自身
- AQS的int变量
- AQS的CLH队列
- 小总结
- 加锁就必然要阻塞,有阻塞就必然要排队,实现排队就必然要队列
- status变量+CLH变种的双端队列
6.2.2 内部类Node(Node类在AQS类的内部)
6.2.2.1 Node的int变量
- Node的等待状态waitStatus成员变量(volatile int waitStatus)
- 等候区其他顾客(其他线程)的等待状态,队列中每个排队的个体就是一个Node
6.2.2.2 Node此类的讲解
(1)内部结构
(2)属性说明
6.3 AQS同步队列的基本结构
七、从我们的ReentrantLock开始解读AQS
7.1 Lock接口的实现类,基本上都是通过【聚合】了一个【队列同步器】的一个子类完成线程访问控制的
7.2 ReentrantLock的原理
7.3 从最简单的lock方法开始看看公平和非公平
7.4 非公平锁走起,方法lock()
7.5 方法unlock()
分类:
juc
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
2021-05-05 LeetCode每日一题——1473. 粉刷房子 III(动态规划)
2021-05-05 LeetCode每日一题——740. 删除并获得点数
2021-05-05 线段树从零开始