并发编程 AQS

本文将介绍 JUC 中的 AQS。

一、什么是 AQS ?

AQS,AbstractQueuedSynchronizer,是一个用于构建锁和同步器的框架。

二、核心思想

如果被请求的资源空闲,则将当前线程设置为有效的工作线程,并将被请求的资源设为锁定状态;否则,将线程加入到等待队列中,等待唤醒。

其中,

  • 被请求的资源的状态通过一个 int 类型的成员变量表示

    1
    2
    3
    4
    /**
    * The synchronization state.
    */
    private volatile int state;
  • 等待队列是一个内置的双向链表;当锁被释放后,等待队列中的线程将被按顺序唤醒

三、使用方式

AQS 的使用方式设计基于模板方法模式,在 AQS 中定义了若干模板方式,并编写了对模板方法的调用逻辑,子类需要继承并实现模板方法。

自定义同步器时需要重写以下几个模板方法:

1
2
3
4
5
6
7
8
9
10
// 该线程是否正在独占资源。只有用到condition才需要去实现它
isHeldExclusively()
// 独占方式。尝试获取资源,成功则返回true,失败则返回false
tryAcquire(int)
// 独占方式。尝试释放资源,成功则返回true,失败则返回false
tryRelease(int)
// 共享方式。尝试获取资源。负数表示失败;0表示成功,但没有剩余可用资源;正数表示成功,且有剩余资源
tryAcquireShared(int)
// 共享方式。尝试释放资源,成功则返回true,失败则返回false
tryReleaseShared(int)

参考

  • Java 并发编程实战