AQS

Posted amunote

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AQS相关的知识,希望对你有一定的参考价值。

AQS即队列同步器AbstractQueuedSynchronizer(以下简称同步器),是用来构建锁或者其他同步组件的基础框架。

AQS使用了一个int成员变量表示同步状态。

技术分享图片

AQS通过内置的FIFO双向队列来完成获取锁线程的排队工作


同步器包含两个节点类型的应用,一个指向头节点,一个指向尾节点,未获取到锁的线程会创建节点线程安全(compareAndSetTail)的加入队列尾部。同步队列遵循FIFO,首节点是获取同步状态成功的节点。

技术分享图片

未获取到锁的线程将创建一个节点,设置到尾节点。如下图所示:

技术分享图片

首节点的线程在释放锁时,将会唤醒后继节点。而后继节点将会在获取锁成功时将自己设置为首节点。如下图所示:

技术分享图片

 

独占式/共享式锁获取

  • 独占式:有且只有一个线程能获取到锁,如:ReentrantLock。
  • 共享式:可以多个线程同时获取到锁,如:CountDownLatch
独占式

每个节点自旋观察自己的前一节点是不是Header节点,如果是,就去尝试获取锁。

技术分享图片

独占式锁获取流程:

技术分享图片

共享式:

共享式与独占式的区别:

技术分享图片

共享锁获取流程:

技术分享图片


以上是关于AQS的主要内容,如果未能解决你的问题,请参考以下文章

AQS(AbstractQueuedSynchronizer)源码深度解析—AQS的设计与总体结构

4.从AbstractQueuedSynchronizer(AQS)说起——AQS结语

AQS 详解

AQS学习

Java AQS学习

AQS 源码分析