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,为这个类表示它所需要的业务逻辑和状态。