队列同步器AbstractQueuedSynchronizer(以下简称同步器或AQS),是用来构建锁或者其他同步组件的基础框架,它使用了一个int成员变量表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作。并发包的大师(Doug Lea)期望它能够成为实现大部分同步需求的基础。
AQS的结构与Synchornized的结构绝大部分相似,同样包括阻塞队列与等待集合 ,参见Monitor对象与互斥锁,
只不过在AQS中因为实现了Condition接口,所以等待集合可以有多个。
每一个节点都是Node对象。
定义
- 全称是 AbstractQueuedSynchronizer
- 阻塞式锁和相关的同步器工具的框架;
- 用 state 属性来表示资源的状态(分独占模式和共享模式),子类需要定义如何维护这个状态,控制如何获取
- 锁和释放锁
- getState - 获取 state 状态
- setState - 设置 state 状态
- compareAndSetState - cas 机制设置 state 状态
独占模式是只有一个线程能够访问资源,而共享模式可以允许多个线程访问资源
内部维护了一个FIFO等待队列,类似于 synchronized关键字当中的 Monitor 的 EntryList
- 条件变量来实现等待、唤醒机制,支持多个条件变量,类似于 Monitor 的 WaitSet
- 内部维护了一个Thread exclusiveOwnerThread 来记录当前持有锁的那个线程
功能
1、实现阻塞获取锁 acquire 拿不到锁就去阻塞 等待锁被释放再次获取锁
2、实现非阻塞尝试获取锁 tryAcquire 拿不到锁则直接放弃
3、实现获取锁超时机制
4、实现通过打断来取消
5、实现独占锁及共享锁
6、实现条件不满足的时候等待AQS的结构
:::tips
AQS 由一个阻塞队列和多个ConditionObject组成的多个条件队列组成
:::
等待集合中的线程被唤醒后先进入阻塞队列,再去竞争资源.
AQS有两个内部类 ConditionObject 和 Node。
ConditionObject
Node
维护了一个双向队列。Node封装的是在AQS上阻塞的那些线程对象
State 同步状态
AQS里面最重要的成员变量。在不同类型的所里面表达的含义不同。
在读写锁中,高16位表示读,低16位表示写
