AQS系列文章:
4、队列同步器AQS源码分析之Condition接口、等待队列
先推荐两篇不错的博文:
1、一行一行源码分析清楚AbstractQueuedSynchronizer
2、深入剖析基于并发AQS的(独占锁)重入锁(ReetrantLock)及其Condition实现原理
队列同步器 AbstractQueuedSynchronizer (简称:同步器、AQS),是用来构建锁或者其他同步组件的基础框架,它使用了一个 int 成员变量表示同步状态,通过内置的 FIFO 队列来完成资源获取线程的排队工作。
同步器从其名字就可以看出来它是一个抽象类。因此,同步器的主要使用方式是继承,子类通过继承同步器并实现它的抽象方法来管理同步状态。
同步状态的改变主要通过同步器提供的三个方法:getState()、setState(int newState) 和 compareAndSetState(int expect, int update)。
子类被推荐定义为自定义同步组件的静态内部类,同步器自身没有实现任何同步接口,它仅仅定义了若干同步状态获取和释放的方法来供自定义同步组件使用。
同步器既可以支持独占式地获取同步状态,也可以支持共享式地获取同步状态,这样就可以方便实现不同类型的同步组件(ReentrantReadWriteLock 和 CountDownLatch)。
- 同步器与锁的关系:
同步器是实现锁的关键,在锁的实现中聚合同步器,利用同步器实现锁的语义。
可以这样理解二者的关系:锁是面向使用者的,它定义了使用者与锁交互的接口,隐藏了实现细节;而同步器面向的是锁的实现者,它简化了锁的实现方式,屏蔽了同步状态管理、线程的排队、等待和唤醒等底层操作。锁和同步器很好地隔离了使用者和实现者所需要关注的领域。
1、队列同步器的接口与示例
同步器的设计是基于模板方法模式的,即使用者需要继承同步器并重写指定的方法,随后将同步器组合在自定义同步组件的实现中,并调用同步器提供的模板方法,而这些模板方法将调用使用者重写的方法。
同步器可重写的方法如下表所示:
同步器提供的模板方法如