深入理解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同步队列的基本结构


浙公网安备 33010602011771号