本文首發於一世流雲專欄: https://segmentfault.com/blog...
J.U.C併發包,即java.util.concurrent
包,是JDK的核心工具包,是JDK1.5以後,由 Doug Lea實現並引入。java
整個java.util.concurrent
包,按照功能能夠大體劃分以下:算法
本系列將按上述順序分析J.U.C,分析所基於的源碼爲Oracle JDK1.8.0_111。segmentfault
主要參考書籍:設計模式
早期的JDK版本中,僅僅提供了synchronizd、wait、notify等等比較底層的多線程同步工具,開發人員若是須要開發複雜的多線程應用,一般須要基於JDK提供的這些基礎工具進行封裝,開發本身的工具類。JDK1.5+後,Doug Lea根據一系列常見的多線程設計模式,設計了JUC併發包,其中java.util.concurrent.locks
包下提供了一系列基礎的鎖工具,用以對synchronizd、wait、notify等進行補充、加強。數組
java.util.concurrent.locks
包的結構以下:安全
包內接口和類的簡單UML圖以下:多線程
本部分包含如下文章:併發
早期的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圖以下:
本部分包含如下文章:
這裏的juc-sync同步器框架,是指java.util.concurrent
包下一些輔助同步器類,每一個類都有本身適合的使用場景:
同步器名稱 | 做用 |
---|---|
CountDownLatch | 倒數計數器,構造時設定計數值,當計數值歸零後,全部阻塞線程恢復執行;其內部實現了AQS框架 |
CyclicBarrier | 循環柵欄,構造時設定等待線程數,當全部線程都到達柵欄後,柵欄放行;其內部經過ReentrantLock和Condition實現同步 |
Semaphore | 信號量,相似於「令牌」,用於控制共享資源的訪問數量;其內部實現了AQS框架 |
Exchanger | 交換器,相似於雙向柵欄,用於線程之間的配對和數據交換;其內部根據併發狀況有「單槽交換」和「多槽交換」之分 |
Phaser | 多階段柵欄,至關於CyclicBarrier的升級版,可用於分階段任務的併發控制執行;其內部比較複雜,支持樹形結構,以減小併發帶來的競爭 |
本部分包含如下文章:
這裏的juc-collections集合框架,是指java.util.concurrent
包下的一些同步集合類,按類型劃分能夠分爲:符號表、隊列、Set集合、列表四大類,每一個類都有本身適合的使用場景,整個juc-collections集合框架的結構以下圖:
其中阻塞隊列的分類及特性以下表:
隊列特性 | 有界隊列 | 近似無界隊列 | 無界隊列 | 特殊隊列 |
---|---|---|---|---|
有鎖算法 | ArrayBlockingQueue | LinkedBlockingQueue、LinkedBlockingDeque | / | PriorityBlockingQueue、DelayQueue |
無鎖算法 | / | / | LinkedTransferQueue | SynchronousQueue |
本部分包含如下文章:
executors框架是整個J.U.C包中類/接口關係最複雜的框架,executors其實能夠劃分爲3大塊,每一塊的核心都是基於Executor這個接口:
本部分包含如下文章:
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鎖框架開始,按部就班得介紹各個框架中得多線程工具的使用方法和原理。