文章目錄
- 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;
- 同步隊列的前驅節點和後繼節點 prev && next
- 節點中的線程 thread
-
節點狀态 waitStatus
CANCELlED: 1 等待逾時或者線程被中斷而取消
SIGNAL: -1 後續節點被阻塞,也有可能是即将被阻塞(節點阻塞前将前驅節點狀态置為SIGNAL)
CONDITION: -2 用于條件隊列
PROPAGATE:-3 用于共享鎖,在釋放共享鎖發揮作用
-
條件隊列的下一個節點 nextWaiter
主要用于條件隊列。由于條件隊列是建立在排斥鎖的前提下的,也可以用來檢查和表示鎖的模式,當且僅當該字段為空節點(New Node())時代表共享模式。
3.AbstractQueuedSynchronizer
static final class Node {}
//頭節點,指向隊列中第一個節點。實際使用過程中要麼是初始化的節點,要麼代表最後一個擷取資源成功的節點
private transient volatile Node head;
//尾節點,指向隊列中最後一個節點
private transient volatile Node tail;
//狀态,實際使用中可以表示資源數或者擷取資源成功的線程、鎖重入次數等等
private volatile int state;
4.AQS 内部體系架構
- FairSync: 公平鎖
- NoFairSync: 非公平鎖
5.AQS 子類
- Semphore: 共享鎖案例
- ReentrantLock: 排他鎖案例
- ReentrantReadWriteLock: 共享鎖和排它鎖案例
- ThreadPoolExecutor
- CountDownLatch: 共享鎖案例