首页 > 代码库 > AQS

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