Jdk1.5中包含了并发大神Doug Lea写的并发工具包java.util.concurrent,这个工具包中包含了显示锁和其他的实用同步组件。Doug Lea在构建锁和组件的时候,大多是以队列同步器(AbstractQueuedSynchronizer)为基础的,因此AbstractQueuedSynchronizer可以看作是并发包的基础框架。因此掌握了AbstractQueuedSynchronizer的实现原理,也就掌握了大多数并发组件的实现原理。
AbstractQueuedSynchronizer使用一个int变量state表示同步状态,使用一个隐式的FIFO队列(隐式队列就是并没有声明这样一个队列,只是通过每个节点记录它的上个节点和下个节点来从逻辑上产生一个队列)来完成阻塞线程的排队。
AQS是一个抽象类,当我们要构建一个同步组件的时候,需要定义一个子类继承AQS,这里应用了模板方法设计模式,这里简单回顾一下模板模式:
模板模式由一个抽象类和一个实现类组成,抽象类中主要有三类方法: 模板方法:实现了算法主体框架,供外部调用。里面会调用原语操作和钩子操作。 原语操作:即定义的抽象方法,子类必须重写。 钩子操作:和原语操作类似,也是供子类重写的,区别是钩子操作子类可以选择重写也可以选择不重写,如果不重写则使用抽象类默认操作,通常是一个空操作或抛出异常。
在AQS中没有原语操作,也就是说自定义的子类继承AQS后,不会强制子类重写任何方法。AQS只提供了若干钩子操作,这些钩子操作的默认实现都是直接抛出异常。子类不需要重写所有的钩子操作,只需要根据要构建的同步组件的类型来决定要调用AQS中的哪些模板方法,再实现这些模板方法中用到了的钩子操作即可。
AQS中可供子类重写的钩子操作有:
| 方法名称 | 描述 |
| boolean tryAcquire(int arg) | 独占式获取同步状态,成功返回true,失败返回false。 |
| boolean tryRelease(int arg) | 独占式释放同步状态,成功返回true,失败返回false。 |
延伸阅读
学习是年轻人改变自己的最好方式
我想了解如何学习 |
