队列同步器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的结构

    image.png :::tips AQS 由一个阻塞队列和多个ConditionObject组成的多个条件队列组成 :::

等待集合中的线程被唤醒后先进入阻塞队列,再去竞争资源.

AQS有两个内部类 ConditionObject 和 Node。

ConditionObject

实现了Condition接口,所以可以有多个等待队列。
image.png

Node

维护了一个双向队列。Node封装的是在AQS上阻塞的那些线程对象
image.png

State 同步状态

AQS里面最重要的成员变量。在不同类型的所里面表达的含义不同。
在读写锁中,高16位表示读,低16位表示写