Java多線程系列之J.U.C併發包概述

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)]

本部分包含以下文章:


juc-atomic 原子類框架

早期的JDK版本中,如果要併發的對Integer、Long、Double之類的Java原始類型或引用類型進行操作,一般都需要通過鎖來控制併發,以防數據不一致。

從JDK1.5開始,引入了java.util.concurrent.atomic工具包,該包提供了許多Java原始/引用類型的映射類,如AtomicIntegerAtomicLongAtomicBoolean,這些類可以通過一種“無鎖算法”,線程安全的操作Integer、Long、Boolean等原始類型。

所謂“無鎖算法”,我們在講juc-locks鎖框架系列中,已經接觸過太多次了,其實底層就是通過Unsafe類實現的一種比較並交換的算法,大致的結構如下(具體入參,根據上下文有所不同):
boolean compareAndSet(expectedValue, updateValue);
當希望修改的值與expectedValue相同時,則嘗試將值更新爲updateValue,更新成功返回true,否則返回false。

java.util.concurrent.atomic包結構如下:
clipboard.png

包內類的簡單UML圖如下:
clipboard.png

本部分包含以下文章:


juc-sync 同步器框架

這裏的juc-sync同步器框架,是指java.util.concurrent包下一些輔助同步器類,每個類都有自己適合的使用場景:

同步器名稱 作用
CountDownLatch 倒數計數器,構造時設定計數值,當計數值歸零後,所有阻塞線程恢復執行;其內部實現了AQS框架
CyclicBarrier 循環柵欄,構造時設定等待線程數,當所有線程都到達柵欄後,柵欄放行;其內部通過ReentrantLock和Condition實現同步
Semaphore 信號量,類似於“令牌”,用於控制共享資源的訪問數量;其內部實現了AQS框架
Exchanger 交換器,類似於雙向柵欄,用於線程之間的配對和數據交換;其內部根據併發情況有“單槽交換”和“多槽交換”之分
Phaser 多階段柵欄,相當於CyclicBarrier的升級版,可用於分階段任務的併發控制執行;其內部比較複雜,支持樹形結構,以減少併發帶來的競爭

本部分包含以下文章:


juc-collections 集合框架

這裏的juc-collections集合框架,是指java.util.concurrent包下的一些同步集合類,按類型劃分可以分爲:符號表隊列Set集合列表四大類,每個類都有自己適合的使用場景,整個juc-collections集合框架的結構如下圖:

clipboard.png

其中阻塞隊列的分類及特性如下表:

隊列特性 有界隊列 近似無界隊列 無界隊列 特殊隊列
有鎖算法 ArrayBlockingQueue LinkedBlockingQueue、LinkedBlockingDeque / PriorityBlockingQueue、DelayQueue
無鎖算法 / / LinkedTransferQueue SynchronousQueue

本部分包含以下文章:


juc-executors 執行器框架

executors框架是整個J.U.C包中類/接口關係最複雜的框架,executors其實可以劃分爲3大塊,每一塊的核心都是基於***Executor***這個接口:

  1. 線程池
  2. Future模式
  3. 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鎖框架開始,循序漸進得介紹各個框架中得多線程工具的使用方法和原理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章