天天看點

AQS之基礎分析

文章目錄

  • ​​1.簡介​​
  • ​​2.内部類Node​​
  • ​​3.AbstractQueuedSynchronizer​​
  • ​​4.AQS 内部體系架構​​
  • ​​5.AQS 子類​​

1.簡介

抽象隊列同步器,是一系列同步實作的模闆類,如鎖Lock,信号量Semaphore,倒排計數器CoundDownLatch等都是基于AQS實作的,同時還提供了Condition對象,其await和sign、signAll對象可以用于代替Object的wait和notofy、notifyAll方法。

CLH隊列是是一種先進先出FIFO的雙向隊列,AQS對其實作微調,但原理不變,用于實作同步阻塞。

AQS中實際上包括兩個隊列,同步隊列用于排斥鎖和共享鎖,條件隊列用于Condition對象的等待和喚醒。

2.内部類Node

用于定義CLH隊列中的節點

volatile int waitStatus;
volatile Node prev;
volatile Node next;
volatile Thread thread;
Node nextWaiter;      
AQS之基礎分析
  1. 同步隊列的前驅節點和後繼節點 prev && next
  2. 節點中的線程 thread
  3. 節點狀态 waitStatus

    CANCELlED: 1 等待逾時或者線程被中斷而取消

    SIGNAL: -1 後續節點被阻塞,也有可能是即将被阻塞(節點阻塞前将前驅節點狀态置為SIGNAL)

    CONDITION: -2 用于條件隊列

    PROPAGATE:-3 用于共享鎖,在釋放共享鎖發揮作用

  4. 條件隊列的下一個節點 nextWaiter

    主要用于條件隊列。由于條件隊列是建立在排斥鎖的前提下的,也可以用來檢查和表示鎖的模式,當且僅當該字段為空節點(New Node())時代表共享模式。

3.AbstractQueuedSynchronizer

static final class Node {}
//頭節點,指向隊列中第一個節點。實際使用過程中要麼是初始化的節點,要麼代表最後一個擷取資源成功的節點
private transient volatile Node head;
//尾節點,指向隊列中最後一個節點
private transient volatile Node tail;
//狀态,實際使用中可以表示資源數或者擷取資源成功的線程、鎖重入次數等等
private volatile int state;      
AQS之基礎分析
AQS之基礎分析

4.AQS 内部體系架構

AQS之基礎分析
  • FairSync: 公平鎖
  • NoFairSync: 非公平鎖

5.AQS 子類

  1. Semphore: 共享鎖案例
  2. ReentrantLock: 排他鎖案例
  3. ReentrantReadWriteLock: 共享鎖和排它鎖案例
  4. ThreadPoolExecutor
  5. CountDownLatch: 共享鎖案例