是用来构建锁或者其他同步组件的基础框架,比如 ReentrantLock、ReentrantReadWriteLock 和 CountDownLatch 就是基于 AQS 实现的。它使用了一个 int 成员变量表示同步状态,通过内置的 FIFO 队列来完成资源获取线程的排队工作。它是 CLH 队列锁的一种变体实现,它可以实现 2 种同步方式:独占锁,共享式。
AQS 的主要使用方式是继承,子类通过继承 AQS 并实现它的抽象方法来管理同步状态,同步器的设计基于模板方法模式,所以如果要实现我们的自己的同步工具类就需要覆盖其中几个可重写的方案,如 tryAcquire、tryReleaseShared 等等。
这样设计的目的是同步组件(比如锁)是面向使用者,它定义了使用者与同步组件交互的接口(比如可以允许两个线程并行访问),隐藏了实现细节;同步器面向的是锁的实现者,它简化了锁的实现方式,屏蔽了同步状态管理、线程的排队、等待与唤醒等底层操作。这样就很好地隔离了使用者和实现者所需关注的领域。
在内部,AQS 维护一个共享资源 state,通过内置的 FIFO 来完成获取资源线程的排队工作。该队列由一个一个的 Node 结点组成,每个 Node 结点维护一个 prev 引用和 next 引用,分别指向自己的前驱和后继节点,构成一个双端双向链表。
同时与 Condition 相关的等待队列,节点类型也是 Node,构成了一个单向链表。