回顧前面:java
只有光頭才能變強!
原本我是打算在這章節中寫Lock的子類實現的,但看到了AQS的這麼一個概念,能夠說Lock的子類實現都是基於AQS的。面試
AQS我在面試題中也見過他的身影,但一直不知道是什麼東西。因此本篇我就來說講AQS這個玩意吧,至少知道它的概念是什麼,對吧~算法
那麼接下來咱們就開始吧~c#
首先咱們來普及一下juc是什麼:juc其實就是包的縮寫(java.util.concurrnt)設計模式
咱們能夠發現lock包下有三個抽象的類:微信
一般地:AbstractQueuedSynchronizer簡稱爲AQS多線程
咱們Lock之類的兩個常見的鎖都是基於它來實現的:框架
那麼咱們來看看AbstractQueuedSynchronizer究竟是什麼,看一個類是幹什麼的最快途徑就是看它的頂部註釋post
通讀了一遍,能夠總結出如下比較關鍵的信息:學習
擁有兩種線程模式
上面也提到了AQS裏邊最重要的是狀態和隊列,咱們接下來就看看其源碼是怎麼樣的...
使用volatile修飾實現線程可見性:
修改state狀態值時使用CAS算法來實現:
這個隊列被稱爲:CLH隊列(三個名字組成),是一個雙向隊列
看看它隊列源碼的組成:
static final class Node { // 共享 static final Node SHARED = new Node(); // 獨佔 static final Node EXCLUSIVE = null; // 線程被取消了 static final int CANCELLED = 1; // 後繼線程須要喚醒 static final int SIGNAL = -1; // 等待condition喚醒 static final int CONDITION = -2; // 共享式同步狀態獲取將會無條件地傳播下去(沒看懂) static final int PROPAGATE = -3; // 初始爲0,狀態是上面的幾種 volatile int waitStatus; // 前置節點 volatile Node prev; // 後繼節點 volatile Node next; volatile Thread thread; Node nextWaiter; final boolean isShared() { return nextWaiter == SHARED; } final Node predecessor() throws NullPointerException { Node p = prev; if (p == null) throw new NullPointerException(); else return p; } Node() { // Used to establish initial head or SHARED marker } Node(Thread thread, Node mode) { // Used by addWaiter this.nextWaiter = mode; this.thread = thread; } Node(Thread thread, int waitStatus) { // Used by Condition this.waitStatus = waitStatus; this.thread = thread; } }
獲取獨佔鎖的過程就是在acquire定義的,該方法用到了模板設計模式,由子類實現的~
過程:acquire(int)嘗試獲取資源,若是獲取失敗,將線程插入等待隊列。插入等待隊列後,acquire(int)並無放棄獲取資源,而是根據前置節點狀態狀態判斷是否應該繼續獲取資源,若是前置節點是頭結點,繼續嘗試獲取資源,若是前置節點是SIGNAL狀態,就中斷當前線程,不然繼續嘗試獲取資源。直到當前線程被park()或者獲取到資源,acquire(int)結束。
來源:
釋放獨佔鎖的過程就是在acquire定義的,該方法也用到了模板設計模式,由子類實現的~
過程:首先調用子類的tryRelease()方法釋放鎖,而後喚醒後繼節點,在喚醒的過程當中,須要判斷後繼節點是否知足狀況,若是後繼節點不爲且不是做廢狀態,則喚醒這個後繼節點,不然從tail節點向前尋找合適的節點,若是找到,則喚醒.
來源:
總結一下AQS究竟是什麼吧:
juc包中不少可阻塞的類都是基於AQS構建的
有興趣的同窗可去看源碼和下面的連接繼續學習,我這裏就不講述了。簡簡單單把AQS過一遍~
明天就看Lock顯式鎖實現咯~~~
參考資料:
若是文章有錯的地方歡迎指正,你們互相交流。習慣在微信看技術文章,想要獲取更多的Java資源的同窗,能夠 關注微信公衆號:Java3y。爲了你們方便,剛新建了一下 qq羣:742919422,你們也能夠去交流交流。謝謝支持了!但願能多介紹給其餘有須要的朋友
文章的目錄導航: