摘要:整個(gè)包,按照功能可以大致劃分如下鎖框架原子類框架同步器框架集合框架執(zhí)行器框架本系列將按上述順序分析,分析所基于的源碼為。后,根據(jù)一系列常見的多線程設(shè)計(jì)模式,設(shè)計(jì)了并發(fā)包,其中包下提供了一系列基礎(chǔ)的鎖工具,用以對(duì)等進(jìn)行補(bǔ)充增強(qiáng)。
本文首發(fā)于一世流云專欄:https://segmentfault.com/blog...J.U.C包簡(jiǎn)介
J.U.C并發(fā)包,即java.util.concurrent包,是JDK的核心工具包,是JDK1.5之后,由 Doug Lea實(shí)現(xiàn)并引入。
整個(gè)java.util.concurrent包,按照功能可以大致劃分如下:
juc-locks 鎖框架
juc-atomic 原子類框架
juc-sync 同步器框架
juc-collections 集合框架
juc-executors 執(zhí)行器框架
本系列將按上述順序分析J.U.C,分析所基于的源碼為Oracle JDK1.8.0_111。
主要參考書籍:
《Java Concurrency in Practice》 Brian Goetz等
《JAVA多線程設(shè)計(jì)模式》 結(jié)城 浩
juc-locks 鎖框架早期的JDK版本中,僅僅提供了synchronizd、wait、notify等等比較底層的多線程同步工具,開發(fā)人員如果需要開發(fā)復(fù)雜的多線程應(yīng)用,通常需要基于JDK提供的這些基礎(chǔ)工具進(jìn)行封裝,開發(fā)自己的工具類。JDK1.5+后,Doug Lea根據(jù)一系列常見的多線程設(shè)計(jì)模式,設(shè)計(jì)了JUC并發(fā)包,其中java.util.concurrent.locks包下提供了一系列基礎(chǔ)的鎖工具,用以對(duì)synchronizd、wait、notify等進(jìn)行補(bǔ)充、增強(qiáng)。
java.util.concurrent.locks包的結(jié)構(gòu)如下:
包內(nèi)接口和類的簡(jiǎn)單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 的獨(dú)占功能原理
J.U.C之locks框架(7):Condition 原理
J.U.C之locks框架(8):AbstractQueuedSynchronizer 的共享功能原理
J.U.C之locks框架(9):ReentrantReadWriteLock 原理
J.U.C之locks框架(10):更強(qiáng)的讀寫鎖——StampedLock
juc-atomic 原子類框架早期的JDK版本中,如果要并發(fā)的對(duì)Integer、Long、Double之類的Java原始類型或引用類型進(jìn)行操作,一般都需要通過鎖來控制并發(fā),以防數(shù)據(jù)不一致。
從JDK1.5開始,引入了java.util.concurrent.atomic工具包,該包提供了許多Java原始/引用類型的映射類,如AtomicInteger、AtomicLong、AtomicBoolean,這些類可以通過一種“無鎖算法”,線程安全的操作Integer、Long、Boolean等原始類型。
所謂“無鎖算法”,我們?cè)谥vjuc-locks鎖框架系列中,已經(jīng)接觸過太多次了,其實(shí)底層就是通過Unsafe類實(shí)現(xiàn)的一種比較并交換的算法,大致的結(jié)構(gòu)如下(具體入?yún)ⅲ鶕?jù)上下文有所不同):
boolean compareAndSet(expectedValue, updateValue);
當(dāng)希望修改的值與expectedValue相同時(shí),則嘗試將值更新為updateValue,更新成功返回true,否則返回false。
java.util.concurrent.atomic包結(jié)構(gòu)如下:
包內(nèi)類的簡(jiǎn)單UML圖如下:
本部分包含以下文章:
J.U.C之a(chǎn)tomic框架(1):Unsafe類
J.U.C之a(chǎn)tomic框架(2):AtomicInteger
J.U.C之a(chǎn)tomic框架(3):AtomicReference
J.U.C之a(chǎn)tomic框架(4):Atomic數(shù)組
J.U.C之a(chǎn)tomic框架(5):AtomicXXXFieldUpdater
J.U.C之a(chǎn)tomic框架(6):更強(qiáng)的原子類——LongAdder
juc-sync 同步器框架這里的juc-sync同步器框架,是指java.util.concurrent包下一些輔助同步器類,每個(gè)類都有自己適合的使用場(chǎng)景:
同步器名稱 | 作用 |
---|---|
CountDownLatch | 倒數(shù)計(jì)數(shù)器,構(gòu)造時(shí)設(shè)定計(jì)數(shù)值,當(dāng)計(jì)數(shù)值歸零后,所有阻塞線程恢復(fù)執(zhí)行;其內(nèi)部實(shí)現(xiàn)了AQS框架 |
CyclicBarrier | 循環(huán)柵欄,構(gòu)造時(shí)設(shè)定等待線程數(shù),當(dāng)所有線程都到達(dá)柵欄后,柵欄放行;其內(nèi)部通過ReentrantLock和Condition實(shí)現(xiàn)同步 |
Semaphore | 信號(hào)量,類似于“令牌”,用于控制共享資源的訪問數(shù)量;其內(nèi)部實(shí)現(xiàn)了AQS框架 |
Exchanger | 交換器,類似于雙向柵欄,用于線程之間的配對(duì)和數(shù)據(jù)交換;其內(nèi)部根據(jù)并發(fā)情況有“單槽交換”和“多槽交換”之分 |
Phaser | 多階段柵欄,相當(dāng)于CyclicBarrier的升級(jí)版,可用于分階段任務(wù)的并發(fā)控制執(zhí)行;其內(nèi)部比較復(fù)雜,支持樹形結(jié)構(gòu),以減少并發(fā)帶來的競(jìng)爭(zhēng) |
本部分包含以下文章:
J.U.C之synchronizer框架(1):倒數(shù)計(jì)數(shù)器——CountDownLatch
J.U.C之synchronizer框架(2):循環(huán)柵欄——CyclicBarrier
J.U.C之synchronizer框架(3):信號(hào)量——Semaphore
J.U.C之synchronizer框架(4):數(shù)據(jù)交換器——Exchanger
J.U.C之synchronizer框架(5):多階段柵欄——Phaser
juc-collections 集合框架這里的juc-collections集合框架,是指java.util.concurrent包下的一些同步集合類,按類型劃分可以分為:符號(hào)表、隊(duì)列、Set集合、列表四大類,每個(gè)類都有自己適合的使用場(chǎng)景,整個(gè)juc-collections集合框架的結(jié)構(gòu)如下圖:
其中阻塞隊(duì)列的分類及特性如下表:
隊(duì)列特性 | 有界隊(duì)列 | 近似無界隊(duì)列 | 無界隊(duì)列 | 特殊隊(duì)列 |
---|---|---|---|---|
有鎖算法 | ArrayBlockingQueue | LinkedBlockingQueue、LinkedBlockingDeque | / | PriorityBlockingQueue、DelayQueue |
無鎖算法 | / | / | LinkedTransferQueue | SynchronousQueue |
本部分包含以下文章:
J.U.C之collections框架(1):ConcurrentHashMap的基本原理
J.U.C之collections框架(2):ConcurrentHashMap的擴(kuò)容
J.U.C之collections框架(3):跳表——ConcurrentSkipListMap
J.U.C之collections框架(4):ConcurrentSkipListSet
J.U.C之collections框架(5):“寫時(shí)復(fù)制”的應(yīng)用——CopyOnWriteArrayList
J.U.C之collections框架(6):CopyOnWriteArraySet
J.U.C之collections框架(7):無鎖隊(duì)列——ConcurrentLinkedQueue
J.U.C之collections框架(8):無鎖雙端隊(duì)列——ConcurrentLinkedDeque
J.U.C之collections框架(9):阻塞隊(duì)列簡(jiǎn)介——BlockingQueue
J.U.C之collections框架(10):基于數(shù)組的阻塞隊(duì)列——ArrayBlockingQueue
J.U.C之collections框架(11):基于單鏈表的阻塞隊(duì)列——LinkedBlockingQueue
J.U.C之collections框架(12):基于堆的優(yōu)先級(jí)阻塞隊(duì)列——PriorityBlockingQueue
J.U.C之collections框架(13):特殊的同步隊(duì)列——SynchronousQueue
J.U.C之collections框架(14):延時(shí)阻塞隊(duì)列——DelayQueue
J.U.C之collections框架(15):基于雙鏈表的阻塞雙端隊(duì)列——LinkedBlockingDeque
J.U.C之collections框架(16):LinkedTransferQueue
juc-executors 執(zhí)行器框架executors框架是整個(gè)J.U.C包中類/接口關(guān)系最復(fù)雜的框架,executors其實(shí)可以劃分為3大塊,每一塊的核心都是基于Executor這個(gè)接口:
線程池
Future模式
Fork/Join框架
本部分包含以下文章:
J.U.C之executors框架(1):executors框架概述
J.U.C之executors框架(2):普通線程池——ThreadPoolExecutor
J.U.C之executors框架(3):計(jì)劃線程池——ScheduledThreadPoolExecutor
J.U.C之executors框架(4):Future 模式
J.U.C之executors框架(5):Fork/Join 框架的原理
J.U.C之executors框架(6):Fork/Join 框架的實(shí)現(xiàn)
后續(xù)文章將從juc-locks鎖框架開始,循序漸進(jìn)得介紹各個(gè)框架中得多線程工具的使用方法和原理。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/71505.html
摘要:注意線程與本地操作系統(tǒng)的線程是一一映射的。固定線程數(shù)的線程池提供了兩種創(chuàng)建具有固定線程數(shù)的的方法,固定線程池在初始化時(shí)確定其中的線程總數(shù),運(yùn)行過程中會(huì)始終維持線程數(shù)量不變。 showImg(https://segmentfault.com/img/bVbhK58?w=1920&h=1080); 本文首發(fā)于一世流云專欄:https://segmentfault.com/blog... ...
摘要:關(guān)于接口的介紹,可以參見多線程進(jìn)階二鎖框架接口。最終線程釋放了鎖,并進(jìn)入阻塞狀態(tài)。當(dāng)線程被通知喚醒時(shí),則是將條件隊(duì)列中的結(jié)點(diǎn)轉(zhuǎn)換成等待隊(duì)列中的結(jié)點(diǎn),之后的處理就和獨(dú)占功能完全一樣。 showImg(https://segmentfault.com/img/remote/1460000016012490); 本文首發(fā)于一世流云的專欄:https://segmentfault.com/bl...
摘要:好了,繼續(xù)向下執(zhí)行,嘗試獲取鎖失敗后,會(huì)調(diào)用首先通過方法,將包裝成共享結(jié)點(diǎn),插入等待隊(duì)列,插入完成后隊(duì)列結(jié)構(gòu)如下然后會(huì)進(jìn)入自旋操作,先嘗試獲取一次鎖,顯然此時(shí)是獲取失敗的主線程還未調(diào)用,同步狀態(tài)還是。 showImg(https://segmentfault.com/img/remote/1460000016012541); 本文首發(fā)于一世流云的專欄:https://segmentfa...
摘要:這里呢,我直接給出高并發(fā)場(chǎng)景通常都會(huì)考慮的一些解決思路和手段結(jié)尾如何有效的準(zhǔn)備面試中并發(fā)類問題,我已經(jīng)給出我的理解。 showImg(https://segmentfault.com/img/bV7Viy?w=550&h=405); 主題 又到面試季了,從群里,看到許多同學(xué)分享了自己的面試題目,我也抽空在網(wǎng)上搜索了一些許多公司使用的面試題,目前校招和社招的面試題基本都集中在幾個(gè)大方向上...
摘要:關(guān)于,最后有兩點(diǎn)規(guī)律需要注意當(dāng)?shù)牡却?duì)列隊(duì)首結(jié)點(diǎn)是共享結(jié)點(diǎn),說明當(dāng)前寫鎖被占用,當(dāng)寫鎖釋放時(shí),會(huì)以傳播的方式喚醒頭結(jié)點(diǎn)之后緊鄰的各個(gè)共享結(jié)點(diǎn)。當(dāng)?shù)牡却?duì)列隊(duì)首結(jié)點(diǎn)是獨(dú)占結(jié)點(diǎn),說明當(dāng)前讀鎖被使用,當(dāng)讀鎖釋放歸零后,會(huì)喚醒隊(duì)首的獨(dú)占結(jié)點(diǎn)。 showImg(https://segmentfault.com/img/remote/1460000016012293); 本文首發(fā)于一世流云的專欄:...
閱讀 1120·2023-04-25 14:45
閱讀 2893·2021-09-30 09:59
閱讀 3194·2021-09-22 15:48
閱讀 2489·2019-08-30 15:55
閱讀 3588·2019-08-30 15:44
閱讀 623·2019-08-29 14:07
閱讀 3478·2019-08-26 13:45
閱讀 585·2019-08-26 11:31