AQS

Posted 秋雾茹

tags:

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

AQS(AbstractQueuedSynchronizer)顾名思义,抽象的队列同步器。

它是JUC中大部分同步工具的基础。如:CountDownLatch/FutureTask/ReentrantLock/RenntrantReadWriteLock/Semaphore。

它更是一个模板模式的典型应用。接下来就主要阐述这个模板的主要流程。

 

首先从结构来简单介绍一下AQS,代码如下

class aqs{
  // 表示线程对资源的占有状态
  int state;
  // 线程悬停队列的头指针与尾指针
    Node head;  
    Node tail;
  
  // 双向链表
  static class Node{
    
    int waitStatus;  /*
                  -1(SIGNAL): 表示下一个节点的线程需要被释放
                  1(CANCELLED): 当前节点的线程已被标志为退出状态
                  -2(CONDITION): 用于条件队列
                  -3(PROPAGATE): 共享状态的中间状态
                  0(None): None of the above
               */
    Node prev;
    Node next;
    Thread thread;
  }
}

 

刚刚就有提及AQS就是模板模式实现的。而模板模式最重要的就是流程的制定。而aqs的主流程:

 Acquire:
     while (!tryAcquire(arg)) {
        enqueue thread if it is not already queued;
        possibly block current thread;
     }

 Release:
     if (tryRelease(arg))
        unblock the first queued thread;

 

/**

  最重要的两个方法, 主流程

  

  独占模式与共享模式

  

  Condition

*/

 

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

AQS

源码剖析:AQS-AbstractQueuedSynchronizer

AQS 同步组件学习

并发编程Java并发编程-看懂AQS的前世今生

多线程(十AQS原理-ReentrantLock实现)

Java并发包基石-AQS详解