首頁/ 汽車/ 正文

java併發之AQS(抽象佇列同步器)理解

AQS是什麼?

AQS全稱為AbstractQueuedSynchronizer,即抽象佇列同步器, 是一種同步器框架。

比如我們寫程式碼經常用到的ReentrantLock, CountDownLatch, Semaphore等都是基於AQS來實現的。AQS根據資源的共享方式可以分類獨佔模式(Exclusive)和共享模式(Share)。其中ReentrantLock採用的就是獨佔模式,而CountDownLatch和Semaphore採用的是共享模式。

類圖如下:

java併發之AQS(抽象佇列同步器)理解

AQS類圖

AQS簡要模型如下:

java併發之AQS(抽象佇列同步器)理解

AQS模型

AQS的核心變數如下:

java併發之AQS(抽象佇列同步器)理解

AQS核心變數

可以看到head, tail和state都是用volatile修飾的,保證執行緒間的可見性

其中state就是上圖中的state,是一個共享的資源變數

狀態state的訪問方式有三個:

protected final int getState() { return state; } protected final void setState(int newState) { state = newState; } // CAS方式設定state值 protected final boolean compareAndSetState(int expect, int update) { return unsafe。compareAndSwapInt(this, stateOffset, expect, update); }

head就是頭結點,tail是尾結點,主要用來進行對雙向連結串列節點進行操作使用的

Node就是同步佇列中的每一個節點

ConditionObject是實現條件佇列的物件

具體程式碼太長了我這裡就不貼出來

自定義同步器

如果想要自定義同步器,只需要實現如下方法,因為AQS的其他方法都是不能被重寫的,AQS頂層已經實現好了,不需要子類去實現。只需要實現如下方法即可:

// 獨佔模式,嘗試獲取資源 protected boolean tryAcquire(int arg) { throw new UnsupportedOperationException(); } // 獨佔模式,嘗試釋放資源 protected boolean tryRelease(int arg) { throw new UnsupportedOperationException(); } // 共享模式,嘗試獲取資源 protected int tryAcquireShared(int arg) { throw new UnsupportedOperationException(); } // 共享模式,嘗試釋放資源 protected boolean tryReleaseShared(int arg) { throw new UnsupportedOperationException(); } // 該執行緒是否正在獨佔資源。只有用到condition(條件佇列)才需要去實現它 protected boolean isHeldExclusively() { throw new UnsupportedOperationException(); }

以下根據獨佔模式和共享模式來分析AQS

獨佔模式:

顧名思義,就是一個執行緒可以操作共享資源

流程如下:

java併發之AQS(抽象佇列同步器)理解

獨佔式流程圖

使用獨佔方式獲取的資源是與具體執行緒繫結的。如果一個執行緒獲取到了資源,就會標記是這個執行緒獲取到了(設定 state=1)。其他執行緒嘗試操作 state 時,會發現當前該資源不是自己持有的(state 不為0),會在獲取失敗後被阻塞並被加入到同步佇列中。

共享模式:

顧名思義,就是多個執行緒共同執行一些操作

流程圖如下:

java併發之AQS(抽象佇列同步器)理解

共享式流程圖

使用共享模式資源(state)是不與執行緒繫結的。共享方式預先設定state值,即表示多少個執行緒可以同時操作。

java併發之AQS(抽象佇列同步器)理解

結束圖

相關文章

頂部