并發(fā)編程目錄
磕磕絆絆近半年時(shí)間嘀粱,在工作之余奠骄,前后一共寫了十余篇深入Java并發(fā)編程系列的文章,由于內(nèi)容頗多剩瓶,所以在這里列一個(gè)目錄方便諸位翻閱驹溃。
在學(xué)習(xí)并發(fā)編程時(shí),大家都會(huì)接觸一個(gè)關(guān)鍵字:volatile
延曙,使用它修飾的成員可以保證多線程之間可見豌鹤,而想要理解它的實(shí)現(xiàn)之前,首先需要先掌握的就是Java的內(nèi)存模型:JMM枝缔。所以volatile與JMM
作為了并發(fā)系列的開篇:
多線程編程中布疙,注定是會(huì)牽扯并發(fā)安全問題的,而在Java中提供了原生的synchronized
關(guān)鍵字作為隱式鎖愿卸,保證多線程之間的線程安全灵临。其內(nèi)部覆蓋的知識(shí)面較多,需要理解的地方也并不少趴荸。第二/三篇文章則是圍繞著synchronized
關(guān)鍵字從基本的應(yīng)用到JVM源碼儒溉,全面的對(duì)它進(jìn)行原理剖析:
- (二)《徹底理解Java并發(fā)編程之Synchronized關(guān)鍵字實(shí)現(xiàn)原理剖析》
- (三)《死磕并發(fā)之深入Hotspot源碼剖析Synchronized關(guān)鍵字實(shí)現(xiàn)》
再談到Java的JUC并發(fā)包,其內(nèi)部大量的應(yīng)用了CAS機(jī)制作為基礎(chǔ)實(shí)現(xiàn)并發(fā)組件笼平,同時(shí)大名鼎鼎的無鎖策略园骆,也是采用CAS技術(shù)來保證線程執(zhí)行的安全性寓调,CAS機(jī)制就是無鎖策略實(shí)現(xiàn)的關(guān)鍵锌唾。在Java中,CAS機(jī)制的實(shí)現(xiàn)是依賴于Unsafe
魔法類提供的native
操作實(shí)現(xiàn)晌涕,同時(shí)Unsafe
類也是整個(gè)JUC原子包的核心。下面一篇文章則從CAS機(jī)制的初步探討巡扇,到Unsafe
魔法類以及Atomic
原子包的源碼分析進(jìn)行了闡述:
前面談到:CAS機(jī)制是JUC并發(fā)包的基石花墩,那么接下來要敘述的AQS則是整個(gè)并發(fā)包的核心村缸。AQS作為JUC包中的特殊存在梯皿,向下依賴了自旋以及CAS機(jī)制,向上則提供了一個(gè)同步器的實(shí)現(xiàn)东羹,它并不直接對(duì)外提供服務(wù),而是作為基礎(chǔ)組件恕酸,為JUC包中的其他并發(fā)組件提供服務(wù)堪滨,如ReetrantLock、Semaphore
與CountDownLatch
等常用的并發(fā)工具蕊温。下面兩篇文章分別從AQS獨(dú)占式以及共享式兩種模式袱箱,對(duì)AQS進(jìn)行了全面分析:
- (五)《深入剖析并發(fā)之AQS獨(dú)占鎖&重入鎖(ReetrantLock)及Condition實(shí)現(xiàn)原理》
- (六)《手撕并發(fā)編程之基于Semaphore與CountDownLatch分析AQS共享模式實(shí)現(xiàn)》
談完AQS后,前面文章中义矛,解決并發(fā)安全問題的方案一共出現(xiàn)了隱式鎖方案发笔、無鎖策略、顯式獨(dú)占鎖以及共享鎖模式四種症革,而緊接著要談的ThreadLocal
卻反其道而行之筐咧,從共享變量拷貝副本的角度出發(fā),避免了多線程競(jìng)爭(zhēng)噪矛,從而解決了線程安全問題量蕊。它屬于一種防止并發(fā)問題產(chǎn)生的的重要手段:
回歸根本,在我們學(xué)習(xí)Java并發(fā)編程時(shí)艇挨,大家對(duì)于多線程的創(chuàng)建方式都不陌生残炮,繼承Thread
類以及實(shí)現(xiàn)Runnable、Callable
接口缩滨。但實(shí)際上势就,創(chuàng)建多線程的方式只有一種,那就是繼承Thread
類脉漏,因?yàn)橹挥羞@種方式才能真正的映射一條OS的內(nèi)核線程執(zhí)行苞冯,Runnable、Callable
對(duì)象則只能被稱為一個(gè)多線程任務(wù)侧巨。但無論創(chuàng)建哪種類型的任務(wù)都無法實(shí)現(xiàn)真正意義上的異步回調(diào)舅锄,而Java8中推出的CompletableFuture
成為了真正劃時(shí)代的方式。下面一篇文章對(duì)多線程任務(wù)進(jìn)行了全面分析:
在多線程開發(fā)過程中,往往之前的容器如:HashMap坦仍、ArrayList
等鳍烁,在多線程環(huán)境中都會(huì)出現(xiàn)安全隱患,而HashTable繁扎、Vector
等這類的安全容器則犧牲了大量的性能換取線程安全性幔荒,使用它們往往不能滿足日益增長(zhǎng)的用戶需求。而在JUC包中也提供了大量的并發(fā)容器,它們?cè)谀軌虼_保線程安全的同時(shí)也能在性能方面表現(xiàn)優(yōu)良铺峭,第九篇?jiǎng)t從源碼角度全面的剖析了Java中的常見并發(fā)容器:
前述文章中卫键,對(duì)于并發(fā)相關(guān)的工具都分析了個(gè)大概傀履,接著來看看Java線程池家族中的ThreadPoolExecutor
體系,線程池能夠?qū)ava程序中創(chuàng)建出的線程進(jìn)行統(tǒng)一的管理莉炉、調(diào)度以及監(jiān)控钓账,同時(shí)也做到了將一條線程復(fù)用。下面的文章中絮宁,從創(chuàng)建無規(guī)則的線程隱患問題分析到線程池的源碼解讀梆暮,全面詳解了ThreadPoolExecutor
體系:
上章中詳解了線程池家族的ThreadPoolExecutor
體系啦粹,而在Java7中再次推出了Fork/Join
框架,作為了Java中對(duì)分治思想的實(shí)現(xiàn)以及作為ThreadPoolExecutor
體系補(bǔ)充窘游,同時(shí)也為Java8中的并行流技術(shù)打下了扎實(shí)的基礎(chǔ)唠椭。ForkJoinPool
同時(shí)也能夠在最大程度上發(fā)揮出多核機(jī)器的性能,其內(nèi)部采用了工作竊取的算法保證了每條線程的工作飽和忍饰。但Fork/Join
框架的整體實(shí)現(xiàn)過于龐大贪嫂,下面通過兩篇三萬多字的文章進(jìn)行闡述:
- (十一)《徹悟并發(fā)之JUC分治思想產(chǎn)物-ForkJoin分支合并框架原理剖析上篇》
- (十二)《徹悟并發(fā)之JUC分治思想產(chǎn)物-ForkJoin分支合并框架原理剖析下篇》
上述大部分文章中,絕大多數(shù)情況我們都是在圍繞著多線程之間的線程安全問題進(jìn)行撰寫艾蓝,但它們都是基于單體架構(gòu)下的Java程序進(jìn)行分析的力崇,而如今單體架構(gòu)的時(shí)代早已遠(yuǎn)去,一般目前Java程序都是通過多機(jī)器赢织、分布式的架構(gòu)模式進(jìn)行部署亮靴。那么在多部署環(huán)境下,之前我們分析的CAS無鎖于置、隱式鎖台猴、顯式鎖等方案是否還有效呢?答案是無效俱两。在新的架構(gòu)下,對(duì)于線程安全問題的解決則又需要推出新的方案:分布式鎖曹步。終篇的文章中從分布式架構(gòu)下的安全問題闡述到Redis宪彩、Zookeeper
實(shí)現(xiàn)分布式鎖的原理分析進(jìn)行了全面敘述:
至此讲婚,整個(gè)并發(fā)編程系列的文章告一段落尿孔,后續(xù)缺失的一部分有機(jī)會(huì)再來補(bǔ)充。
前述中一直在對(duì)于并發(fā)工具和并發(fā)安全問題進(jìn)行闡述,而對(duì)于并發(fā)編程其他的一些問題忽略了活合,如死鎖雏婶、活鎖、鎖饑餓等問題白指,也包括對(duì)于線程留晚、進(jìn)程、纖程告嘲、協(xié)程等一些概念未做敘述错维,而如今再在最后進(jìn)行補(bǔ)充:
以上文章一般多以底層、原理源碼等深度分析為主僧界,雖不能保證絕對(duì)權(quán)威侨嘀,但至少能為諸君理解Java并發(fā)編程的鋪平道路!如果你對(duì)于文章中有存在疑義的地方可以在評(píng)論區(qū)指正留言捎泻!
同時(shí)如果你感覺文章對(duì)于你有幫助飒炎,歡迎點(diǎn)贊、評(píng)論笆豁、收藏郎汪、關(guān)注!
下期預(yù)告:《深入理解Java虛擬機(jī)JVM系列》
先上一副個(gè)人畫的JVM圖給大家欣賞:《深入理解Java虛擬機(jī)之JVM全景架構(gòu)圖》
身體和心靈總要有一個(gè)在路上闯狱,要么旅行煞赢,要么學(xué)習(xí)!