一 . 概述
在之前我们讨论过线程的高效的提升方式,在JUC之中提供了各种方式来提升并发的效果.
其中大多数的并发容器,并发辅助类,队列等都使用了一个类,这个类就是AQS.
可以这么说AQS完成了JUC的大部分底层实现.
二 .AQS的介绍
AbstractQueuedSynchronizer(抽象的队列同步器).
这个类依靠一个队列实现了一个同步器,通过这个同步器我们可以实现各种的线程同步工具,我们的JUC之中大量的使用了这个类.
我们日常之中一般不会去使用这个类,但是了解一下这个类的作用还是十分有必要的.
该类模拟的就是synchronized,反映的现实就是获取和释放,只是在不同的组件之中的含义不一致,AQS使用int值代表这个状态.
我们看一下释放和获取的操作代码:
我们看到核心就是根据状态进行线程到队列的操作,这也就是AQS的名称的由来.
基本的方式就是:
[1]根据那个int判断状态
[2]状态不允许阻塞线程并且加入到等待队列之中
[3]获取成功移除队列的线程
我们看到AQS方式和synchronize的思想是一致的.
三 .AQS的高效
AQS为什么高效呢? 原因就在与使用了CAS的方式,实际上是一种通过无锁来完成的性能提升.
当然synchronized经过了偏向锁,轻量级自旋锁,重量级锁的分级之后性能也是不错的.
因此在JUC之中,大量的组件都使用了AQS完成了自己的实现,因此AQS提供了一个基础组件的功能.