AbstractQueuedSynchronizer是由Doug Lea写的,从JDK1.5加入的一个基于FIFO等待队列实现的一个用于实现同步容器的基础框架

    事实上,ReentrantLock,Semaphone,CountDownLatch,ReentrantReadWriteLock的底层都用了一个共同的基类,就是AQS。

    Semaphore和AQS的关系
    Semaphore内部有一个Sync类,该类继承了AQS。
    countDownLatch也是一样
    ReentrantLock也是如此

    AQS的作用:
    AQS是一个用于构建锁,同步器,协助工具类的工具类(可以理解为框架),有了AQS后,更多的写作工具类都可以很方便的被写出来
    总结一句话:有了AQS,构建线程协助类就容易多了。

    AQS的三大核心部分
    1.state
    根据不同的实现类含义不一样
    Semaphore中state表示“剩余许可证的数量”
    countDownLatch中state表示“还需要倒数的数量”
    ReentractLock中state表示可重入计数,state=0时,代表该锁不被任何线程所占有。

    2.控制线程枪锁和配合的FIFO队列
    这个队列(双向列表)是用来存放等待的线程

    3.期望协助工具类去实现的获取/释放等重要方法
    获取和释放方法由协助类自己实现,并且含义各不同
    获取方法:
    例如:ReentrantLock中,当state不为0时,线程会被阻塞
    在Semaphore中,获取就是acquire方法,作用是获取一个许可证
    释放方法:
    例如:在Semaphore中,释放方法就是release方法,作用是释放一个许可证。
    在CountDownLatch中,获取就是countDown方法,作用是state减一。