J.U.C包簡介
J.U.C併發包,即java.util.concurrent
包,是JDK的核心工具包,是JDK1.5之後,由 Doug Lea實現並引入。
整個java.util.concurrent
包,按照功能可以大致劃分如下:
- juc-locks 鎖框架
- juc-atomic 原子類框架
- juc-sync 同步器框架
- juc-collections 集合框架
- juc-executors 執行器框架
本系列將按上述順序分析J.U.C,分析所基於的源碼爲Oracle JDK1.8.0_111。
主要參考書籍:
- 《Java Concurrency in Practice》 Brian Goetz等
- 《JAVA多線程設計模式》 結城 浩
juc-locks 鎖框架
早期的JDK版本中,僅僅提供了synchronizd、wait、notify等等比較底層的多線程同步工具,開發人員如果需要開發複雜的多線程應用,通常需要基於JDK提供的這些基礎工具進行封裝,開發自己的工具類。JDK1.5+後,Doug Lea根據一系列常見的多線程設計模式,設計了JUC併發包,其中java.util.concurrent.locks
包下提供了一系列基礎的鎖工具,用以對synchronizd、wait、notify等進行補充、增強。
java.util.concurrent.locks
包的結構如下:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-XDZmDBQX-1574218401078)(https://segmentfault.com/img/remote/1460000015559079)]
包內接口和類的簡單UML圖如下:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-fHirW8Q9-1574218401080)(https://segmentfault.com/img/remote/1460000015559094)]
本部分包含以下文章:
- J.U.C之locks框架(1):接口說明
- J.U.C之locks框架(2):ReentrantLock 的使用
- J.U.C之locks框架(3):ReentrantReadWriteLock 的使用
- J.U.C之locks框架(4):LockSupport 工具類
- J.U.C之locks框架(5):AbstractQueuedSynchronizer 綜述
- J.U.C之locks框架(6):AbstractQueuedSynchronizer 的獨佔功能原理
- J.U.C之locks框架(7):Condition 原理
- J.U.C之locks框架(8):AbstractQueuedSynchronizer 的共享功能原理
- J.U.C之locks框架(9):ReentrantReadWriteLock 原理
- J.U.C之locks框架(10):更強的讀寫鎖——StampedLock
juc-atomic 原子類框架
早期的JDK版本中,如果要併發的對Integer、Long、Double之類的Java原始類型或引用類型進行操作,一般都需要通過鎖來控制併發,以防數據不一致。
從JDK1.5開始,引入了java.util.concurrent.atomic
工具包,該包提供了許多Java原始/引用類型的映射類,如AtomicInteger
、AtomicLong
、AtomicBoolean
,這些類可以通過一種“無鎖算法”,線程安全的操作Integer、Long、Boolean等原始類型。
所謂“無鎖算法”,我們在講juc-locks鎖框架系列中,已經接觸過太多次了,其實底層就是通過Unsafe類實現的一種比較並交換的算法,大致的結構如下(具體入參,根據上下文有所不同):
boolean compareAndSet(expectedValue, updateValue);
當希望修改的值與expectedValue相同時,則嘗試將值更新爲updateValue,更新成功返回true,否則返回false。
java.util.concurrent.atomic
包結構如下:
包內類的簡單UML圖如下:
本部分包含以下文章:
- J.U.C之atomic框架(1):Unsafe類
- J.U.C之atomic框架(2):AtomicInteger
- J.U.C之atomic框架(3):AtomicReference
- J.U.C之atomic框架(4):Atomic數組
- J.U.C之atomic框架(5):AtomicXXXFieldUpdater
- J.U.C之atomic框架(6):更強的原子類——LongAdder
juc-sync 同步器框架
這裏的juc-sync同步器框架,是指java.util.concurrent
包下一些輔助同步器類,每個類都有自己適合的使用場景:
同步器名稱 | 作用 |
---|---|
CountDownLatch | 倒數計數器,構造時設定計數值,當計數值歸零後,所有阻塞線程恢復執行;其內部實現了AQS框架 |
CyclicBarrier | 循環柵欄,構造時設定等待線程數,當所有線程都到達柵欄後,柵欄放行;其內部通過ReentrantLock和Condition實現同步 |
Semaphore | 信號量,類似於“令牌”,用於控制共享資源的訪問數量;其內部實現了AQS框架 |
Exchanger | 交換器,類似於雙向柵欄,用於線程之間的配對和數據交換;其內部根據併發情況有“單槽交換”和“多槽交換”之分 |
Phaser | 多階段柵欄,相當於CyclicBarrier的升級版,可用於分階段任務的併發控制執行;其內部比較複雜,支持樹形結構,以減少併發帶來的競爭 |
本部分包含以下文章:
- J.U.C之synchronizer框架(1):倒數計數器——CountDownLatch
- J.U.C之synchronizer框架(2):循環柵欄——CyclicBarrier
- J.U.C之synchronizer框架(3):信號量——Semaphore
- J.U.C之synchronizer框架(4):數據交換器——Exchanger
- J.U.C之synchronizer框架(5):多階段柵欄——Phaser
juc-collections 集合框架
這裏的juc-collections集合框架,是指java.util.concurrent
包下的一些同步集合類,按類型劃分可以分爲:符號表、隊列、Set集合、列表四大類,每個類都有自己適合的使用場景,整個juc-collections集合框架的結構如下圖:
其中阻塞隊列的分類及特性如下表:
隊列特性 | 有界隊列 | 近似無界隊列 | 無界隊列 | 特殊隊列 |
---|---|---|---|---|
有鎖算法 | ArrayBlockingQueue | LinkedBlockingQueue、LinkedBlockingDeque | / | PriorityBlockingQueue、DelayQueue |
無鎖算法 | / | / | LinkedTransferQueue | SynchronousQueue |
本部分包含以下文章:
- J.U.C之collections框架(1):ConcurrentHashMap的基本原理
- J.U.C之collections框架(2):ConcurrentHashMap的擴容
- J.U.C之collections框架(3):跳錶——ConcurrentSkipListMap
- J.U.C之collections框架(4):ConcurrentSkipListSet
- J.U.C之collections框架(5):“寫時複製”的應用——CopyOnWriteArrayList
- J.U.C之collections框架(6):CopyOnWriteArraySet
- J.U.C之collections框架(7):無鎖隊列——ConcurrentLinkedQueue
- J.U.C之collections框架(8):無鎖雙端隊列——ConcurrentLinkedDeque
- J.U.C之collections框架(9):阻塞隊列簡介——BlockingQueue
- J.U.C之collections框架(10):基於數組的阻塞隊列——ArrayBlockingQueue
- J.U.C之collections框架(11):基於單鏈表的阻塞隊列——LinkedBlockingQueue
- J.U.C之collections框架(12):基於堆的優先級阻塞隊列——PriorityBlockingQueue
- J.U.C之collections框架(13):特殊的同步隊列——SynchronousQueue
- J.U.C之collections框架(14):延時阻塞隊列——DelayQueue
- J.U.C之collections框架(15):基於雙鏈表的阻塞雙端隊列——LinkedBlockingDeque
- J.U.C之collections框架(16):LinkedTransferQueue
juc-executors 執行器框架
executors框架是整個J.U.C包中類/接口關係最複雜的框架,executors其實可以劃分爲3大塊,每一塊的核心都是基於***Executor***這個接口:
- 線程池
- Future模式
- Fork/Join框架
本部分包含以下文章:
J.U.C之executors框架(1):executors框架概述
J.U.C之executors框架(2):普通線程池——ThreadPoolExecutor
J.U.C之executors框架(3):計劃線程池——ScheduledThreadPoolExecutor
J.U.C之executors框架(4):Future 模式
J.U.C之executors框架(5):Fork/Join 框架的原理
J.U.C之executors框架(6):Fork/Join 框架的實現
後續文章將從juc-locks鎖框架開始,循序漸進得介紹各個框架中得多線程工具的使用方法和原理。