跳到主要内容

Java并发编程学习十四:AQS框架

一、AQS框架简介

AQS,即AbstractQueuedSynchronizer,在 ReentrantLock、ReentrantReadWriteLock、Semaphore、CountDownLatch、ThreadPoolExcutor 的 Worker 中都有运用(JDK 1.8),AQS 是这些类的底层原理。

为什么要有AQS呢?是因为对于ReentrantLock、Semaphore等线程协作工具类而言,它们有很多工作是类似的,所以如果能把实现类似工作的代码给提取出来,变成一个新的底层工具类(或称为框架)的话,就可以直接使用这个工具类来构建上层代码了,而这个工具类其实就是 AQS。

AQS至少为线程协作工具类实现了以下内容:

  • 状态的原子性管理
  • 线程的阻塞与解除阻塞
  • 队列的管理

总而言之,AQS 是一个用于构建锁、同步器等线程协作工具类的框架,有了 AQS 以后,很多用于线程协作的工具类就都可以很方便的被写出来,有了 AQS 之后,可以让更上层的开发极大的减少工作量,避免重复造轮子,同时也避免了上层因处理不当而导致的线程安全问题,因为 AQS 把这些事情都做好了。

二、AQS原理简介

这里仅仅介绍AQS的三大部分:状态、队列和期望协作工具类去实现的获取/释放等重要方法,对于AQS 的源码分析,可以参考:源码解析

1. 状态

AQS想要去管理或者想作为协作工具类的一个基础框架,那么它必然要管理一些状态,而这个状态在 AQS 内部就是用 state 变量去表示的。

/**
* The synchronization state.
*/
private volatile int state;

这个state的含义,会根据具体实现类的作用不同而不同。

对于信号量Semaphore,state 表示的是剩余许可证的数量;对于CountDownLatch,state 表示的是需要“倒数”的数量;对于ReentrantLock ,state表示的是锁的占有情况(因为可重入,state是大于等0的正整数)。

如果需要基于AQS创建新的协作工具类,一定也需要利用 state,为这个类表示它所需要的业务逻辑和状态。