併發容器J.U.C -- AQS元件(一)
AQS簡介
AQS全名:AbstractQueuedSynchronizer,是併發容器J.U.C(java.lang.concurrent)下locks包內的一個類。它實現了一個FIFO(FirstIn、FisrtOut先進先出)的佇列。底層實現的資料結構是一個雙向列表。
Sync queue:同步佇列,是一個雙向列表。包括head節點和tail節點。head節點主要用作後續的排程。
Condition queue:非必須,單向列表。當程式中存在cindition的時候才會存在此列表。
AQS設計原理
- 使用Node實現FIFO佇列,可以用於構建鎖或者其他同步裝置的基礎框架。
- 利用int型別標識狀態。在AQS類中有一個叫做state的成員變數(
private volatile int state;
),表示獲取鎖的執行緒數(state=0,表示還沒有執行緒獲取鎖,1表示有執行緒獲取了鎖。大於1表示重入鎖的數量)和一個同步元件ReentrantLock。 - 使用方法是繼承,基於模板方法。
- 子類通過繼承並通過實現它的方法管理其狀態(acquire和release方法操縱狀態)。
- 可實現排它鎖和共享鎖模式(獨佔、共享)。AQS的功能主要分為兩類:獨佔和共享。子類,要麼實現並使用了它的獨佔功能的api,要麼使用了共享鎖的功能,而不會同時使用兩套api,即便是最有名的子類ReentrantReadWriteLock也是通過兩個內部類讀鎖和寫鎖分別實現了兩套api來實現的。
可重入鎖,指對同一個ReentrantLock物件多次執行lock()加鎖和unlock()釋放鎖。
AQS實現思路
- AQS內部維護了一個CLH佇列來管理鎖。
- 執行緒會首先嚐試獲取鎖,如果失敗就將當前執行緒及等待狀態等資訊包裝成一個node節點加入到同步佇列sync queue裡。
- 不斷的重新嘗試獲取鎖(當前節點為head的直接後繼才會嘗試)。如果失敗就會阻塞自己,直到自己被喚醒。
- 當持有鎖的執行緒釋放鎖的時候,會喚醒佇列中的後繼執行緒。
相關文章
- 併發容器J.U.C -- AQS同步元件(二)AQS元件
- Java併發程式設計,深度探索J.U.C - AQSJava程式設計AQS
- J.U.C - AQSAQS
- JDK併發AQS系列(一)JDKAQS
- 併發-AQSAQS
- JDK併發AQS系列(三)JDKAQS
- JDK併發AQS系列(五)JDKAQS
- JDK併發AQS系列(二)JDKAQS
- java併發神器 AQS(AbstractQueuedSynchronizer)JavaAQS
- 併發容器與框架——併發容器(二)框架
- [Java原始碼][併發J.U.C]---解析ReentrantReadJava原始碼
- Java併發(5)- ReentrantLock與AQSJavaReentrantLockAQS
- Java併發之AQS詳解JavaAQS
- Java併發之AQS原理剖析JavaAQS
- Java併發(9)- 從同步容器到併發容器Java
- Java併發(6)- CountDownLatch、Semaphore與AQSJavaCountDownLatchAQS
- Java併發——AbstractQueuedSynchronizer(AQS)同步器JavaAQS
- [Java併發]AQS的可重入性JavaAQS
- Java併發容器Java
- Java同步容器和併發容器Java
- 執行緒(十八)J.U.C之AQS:CLH同步佇列執行緒AQS佇列
- Java併發之AQS原始碼分析(二)JavaAQS原始碼
- 高併發程式設計-AQS深入解析程式設計AQS
- 併發程式設計(一)——同步類容器程式設計
- 併發容器之ThreadLocalthread
- 併發容器之CopyOnWriteArrayList
- java 併發程式設計-AQS原始碼分析Java程式設計AQS原始碼
- 併發程式設計——詳解 AQS CLH 鎖程式設計AQS
- Java併發之AQS同步器學習JavaAQS
- 併發程式設計之:AQS原始碼解析程式設計AQS原始碼
- Java併發指南9:AQS共享模式與併發工具類的實現JavaAQS模式
- Java併發程式設計-鎖及併發容器Java程式設計
- 併發程式設計(二)——併發類容器ConcurrentMap程式設計
- 併發容器、框架、工具類框架
- 一文搞懂AQS及其元件的核心原理AQS元件
- 併發容器的原理,七大併發容器詳解、及使用場景
- 一文帶你學會AQS和併發工具類的關係AQS
- Java併發指南14:Java併發容器ConcurrentSkipListMap與CopyOnWriteArrayListJava