摘要:整個包,按照功能可以大致劃分如下鎖框架原子類框架同步器框架集合框架執行器框架本系列將按上述順序分析,分析所基于的源碼為。后,根據一系列常見的多線程設計模式,設計了并發包,其中包下提供了一系列基礎的鎖工具,用以對等進行補充增強。
本文首發于一世流云專欄:https://segmentfault.com/blog...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包的結構如下:
包內接口和類的簡單UML圖如下:
本部分包含以下文章:
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鎖框架開始,循序漸進得介紹各個框架中得多線程工具的使用方法和原理。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71505.html
摘要:注意線程與本地操作系統的線程是一一映射的。固定線程數的線程池提供了兩種創建具有固定線程數的的方法,固定線程池在初始化時確定其中的線程總數,運行過程中會始終維持線程數量不變。 showImg(https://segmentfault.com/img/bVbhK58?w=1920&h=1080); 本文首發于一世流云專欄:https://segmentfault.com/blog... ...
摘要:關于接口的介紹,可以參見多線程進階二鎖框架接口。最終線程釋放了鎖,并進入阻塞狀態。當線程被通知喚醒時,則是將條件隊列中的結點轉換成等待隊列中的結點,之后的處理就和獨占功能完全一樣。 showImg(https://segmentfault.com/img/remote/1460000016012490); 本文首發于一世流云的專欄:https://segmentfault.com/bl...
摘要:好了,繼續向下執行,嘗試獲取鎖失敗后,會調用首先通過方法,將包裝成共享結點,插入等待隊列,插入完成后隊列結構如下然后會進入自旋操作,先嘗試獲取一次鎖,顯然此時是獲取失敗的主線程還未調用,同步狀態還是。 showImg(https://segmentfault.com/img/remote/1460000016012541); 本文首發于一世流云的專欄:https://segmentfa...
摘要:這里呢,我直接給出高并發場景通常都會考慮的一些解決思路和手段結尾如何有效的準備面試中并發類問題,我已經給出我的理解。 showImg(https://segmentfault.com/img/bV7Viy?w=550&h=405); 主題 又到面試季了,從群里,看到許多同學分享了自己的面試題目,我也抽空在網上搜索了一些許多公司使用的面試題,目前校招和社招的面試題基本都集中在幾個大方向上...
摘要:關于,最后有兩點規律需要注意當的等待隊列隊首結點是共享結點,說明當前寫鎖被占用,當寫鎖釋放時,會以傳播的方式喚醒頭結點之后緊鄰的各個共享結點。當的等待隊列隊首結點是獨占結點,說明當前讀鎖被使用,當讀鎖釋放歸零后,會喚醒隊首的獨占結點。 showImg(https://segmentfault.com/img/remote/1460000016012293); 本文首發于一世流云的專欄:...
閱讀 995·2023-04-25 14:45
閱讀 2772·2021-09-30 09:59
閱讀 3114·2021-09-22 15:48
閱讀 2424·2019-08-30 15:55
閱讀 3467·2019-08-30 15:44
閱讀 535·2019-08-29 14:07
閱讀 3412·2019-08-26 13:45
閱讀 535·2019-08-26 11:31