并發編程目錄
磕磕絆絆近半年時間,在工作之余,前后一共寫了十余篇深入Java并發編程系列的文章,由于內容頗多,所以在這里列一個目錄方便諸位翻閱。
在學習并發編程時,大家都會接觸一個關鍵字:volatile
,使用它修飾的成員可以保證多線程之間可見,而想要理解它的實現之前,首先需要先掌握的就是Java的內存模型:JMM。所以volatile與JMM
作為了并發系列的開篇:
多線程編程中,注定是會牽扯并發安全問題的,而在Java中提供了原生的synchronized
關鍵字作為隱式鎖,保證多線程之間的線程安全。其內部覆蓋的知識面較多,需要理解的地方也并不少。第二/三篇文章則是圍繞著synchronized
關鍵字從基本的應用到JVM源碼,全面的對它進行原理剖析:
再談到Java的JUC并發包,其內部大量的應用了CAS機制作為基礎實現并發組件,同時大名鼎鼎的無鎖策略,也是采用CAS技術來保證線程執行的安全性,CAS機制就是無鎖策略實現的關鍵。在Java中,CAS機制的實現是依賴于Unsafe
魔法類提供的native
操作實現,同時Unsafe
類也是整個JUC原子包的核心。下面一篇文章則從CAS機制的初步探討,到Unsafe
魔法類以及Atomic
原子包的源碼分析進行了闡述:
前面談到:CAS機制是JUC并發包的基石,那么接下來要敘述的AQS則是整個并發包的核心。AQS作為JUC包中的特殊存在,向下依賴了自旋以及CAS機制,向上則提供了一個同步器的實現,它并不直接對外提供服務,而是作為基礎組件,為JUC包中的其他并發組件提供服務,如ReetrantLock、Semaphore
與CountDownLatch
等常用的并發工具。下面兩篇文章分別從AQS獨占式以及共享式兩種模式,對AQS進行了全面分析:
- (五)《深入剖析并發之AQS獨占鎖&重入鎖(ReetrantLock)及Condition實現原理》
- (六)《手撕并發編程之基于Semaphore與CountDownLatch分析AQS共享模式實現》
談完AQS后,前面文章中,解決并發安全問題的方案一共出現了隱式鎖方案、無鎖策略、顯式獨占鎖以及共享鎖模式四種,而緊接著要談的ThreadLocal
卻反其道而行之,從共享變量拷貝副本的角度出發,避免了多線程競爭,從而解決了線程安全問題。它屬于一種防止并發問題產生的的重要手段:
回歸根本,在我們學習Java并發編程時,大家對于多線程的創建方式都不陌生,繼承Thread
類以及實現Runnable、Callable
接口。但實際上,創建多線程的方式只有一種,那就是繼承Thread
類,因為只有這種方式才能真正的映射一條OS的內核線程執行,Runnable、Callable
對象則只能被稱為一個多線程任務。但無論創建哪種類型的任務都無法實現真正意義上的異步回調,而Java8中推出的CompletableFuture
成為了真正劃時代的方式。下面一篇文章對多線程任務進行了全面分析:
在多線程開發過程中,往往之前的容器如:HashMap、ArrayList
等,在多線程環境中都會出現安全隱患,而HashTable、Vector
等這類的安全容器則犧牲了大量的性能換取線程安全性,使用它們往往不能滿足日益增長的用戶需求。而在JUC包中也提供了大量的并發容器,它們在能夠確保線程安全的同時也能在性能方面表現優良,第九篇則從源碼角度全面的剖析了Java中的常見并發容器:
前述文章中,對于并發相關的工具都分析了個大概,接著來看看Java線程池家族中的ThreadPoolExecutor
體系,線程池能夠對Java程序中創建出的線程進行統一的管理、調度以及監控,同時也做到了將一條線程復用。下面的文章中,從創建無規則的線程隱患問題分析到線程池的源碼解讀,全面詳解了ThreadPoolExecutor
體系:
上章中詳解了線程池家族的ThreadPoolExecutor
體系,而在Java7中再次推出了Fork/Join
框架,作為了Java中對分治思想的實現以及作為ThreadPoolExecutor
體系補充,同時也為Java8中的并行流技術打下了扎實的基礎。ForkJoinPool
同時也能夠在最大程度上發揮出多核機器的性能,其內部采用了工作竊取的算法保證了每條線程的工作飽和。但Fork/Join
框架的整體實現過于龐大,下面通過兩篇三萬多字的文章進行闡述:
上述大部分文章中,絕大多數情況我們都是在圍繞著多線程之間的線程安全問題進行撰寫,但它們都是基于單體架構下的Java程序進行分析的,而如今單體架構的時代早已遠去,一般目前Java程序都是通過多機器、分布式的架構模式進行部署。那么在多部署環境下,之前我們分析的CAS無鎖、隱式鎖、顯式鎖等方案是否還有效呢?答案是無效。在新的架構下,對于線程安全問題的解決則又需要推出新的方案:分布式鎖。終篇的文章中從分布式架構下的安全問題闡述到Redis、Zookeeper
實現分布式鎖的原理分析進行了全面敘述:
至此,整個并發編程系列的文章告一段落,后續缺失的一部分有機會再來補充。
前述中一直在對于并發工具和并發安全問題進行闡述,而對于并發編程其他的一些問題忽略了,如死鎖、活鎖、鎖饑餓等問題,也包括對于線程、進程、纖程、協程等一些概念未做敘述,而如今再在最后進行補充:
以上文章一般多以底層、原理源碼等深度分析為主,雖不能保證絕對權威,但至少能為諸君理解Java并發編程的鋪平道路!如果你對于文章中有存在疑義的地方可以在評論區指正留言!
同時如果你感覺文章對于你有幫助,歡迎點贊、評論、收藏、關注!
下期預告:《深入理解Java虛擬機JVM系列》
先上一副個人畫的JVM圖給大家欣賞:《深入理解Java虛擬機之JVM全景架構圖》
身體和心靈總要有一個在路上,要么旅行,要么學習!