GitHub標星120K+的JDK併發程式設計指南,連續霸榜GitHub終於開源了

盟主123發表於2020-08-15

前言

在程式設計行業中,有一個東西是和廣大程式設計師形影不離的,在最一開始接觸程式設計就是配置它的執行環境,然後java / javac,對,這個東西就是jdk

昨天專案剛上線,可以稍微休息一下了,但是猛的閒下來,反而有點不適應,想整點什麼東西,想起之前看到的一條訊息,jdk15要釋出了,不得不感慨資訊化產業發展的速度,但是,沒關係,不慌張,他強任他強,我用Java8,沒辦法,oracle jdk的收費政策也讓生產商更加堅定的選擇Java8,但是,雖然你天天在用,但是你真的瞭解Java8嗎?比如我們經常說的執行緒與併發

今天,我們就來看一下,在原始碼層級的執行緒與併發是如何進行的,這也是面試過程中的一個重點

正言

對於執行緒和 程式,我理解的就是汽車和高速公路

但是對於人腦的認知來說,“程式碼一行行序列”當然最容易理解。但在多執行緒下,多個執行緒的程式碼交叉並行,要訪問互斥資源,要互相通訊。作為開發者,需要仔細設計執行緒之間的互斥與同步,稍不留心,就會寫出非執行緒安全的程式碼。正因此,多執行緒程式設計一直是一個被廣泛而深入討論的領域。

在JDK1.5釋出之前,Java只在語言級別上提供一些簡單的執行緒互斥與同步機制,也就是synchronized關鍵字、wait 與notify。如果遇到複雜的多執行緒程式設計場景,就需要開發者基於這些簡單的機制解決複雜的執行緒同步問題。而從JDK 1. 5開始,併發程式設計大師Doug Lea奉上了一個系統而全面的併發程式設計框架一一JDKConcurrent包,裡面包含了1各種原子操作、執行緒安全的容器、執行緒池和非同步程式設計等內容。

本書基於JDK7和JDK8,對整個Concurrent包進行全面的原始碼剖析。JDK8中大部分併發功能的實現和JDK7一樣,但新增了一些額外特性。例如CompletableFuture、ConcurrentHashMap的新實現、StampedLock、LongAdder等。

對整個Concurrent包的原始碼進行分析,有以下幾個目的: 

(1)幫助使用者合理地選擇解決方案。Concurrent包很龐大,有各式各樣的執行緒互斥與同步機制。明白實現原理,使用者可以根據自己的業務場景,選擇最適合自己的解決方案。避免重複造輪子,也避免因為使用不當而掉到“坑”裡。

(2)對原始碼的分析,將讓使用者對記憶體屏障、CAS原子操作、鎖、無鎖等底層原理的認識,不再停留於一個“似是而非”的階段,而是深刻地認識其本質。

(3)吸收借鑑大師的思維。在Concurrent 包中,可以看到各種巧妙的併發處理策略。看了Concurrent包,才會發現在多執行緒中,不是隻有簡陋的互斥鎖、通知機制和執行緒池。

因為涉及內容比較多,這裡就不一一展現了,我整理成了一份文件以及一份知識圖譜

 

目  錄

多執行緒基礎

1.1執行緒的優雅關閉

1.2 InterruptedException ()函式與interrupt ()函式

1.3 synchronized關鍵字

1.4wait ()與notify ()

1.5 volatile關鍵字

1.6 JMM與happen-before

1.7記憶體屏障

1.8 final關鍵字

1.9綜合應用:無鎖程式設計

GitHub標星120K+的JDK併發程式設計指南,連續霸榜GitHub終於開源了

atomic類

2.1 AtomiclInteger和AtomicLong

2.2 AtomicBoolean和AtomicReference

2.3 AtomicStampedReference和AtomicMarkableReference

2.4 AtomicIntegerFieldUpdaterAtomicLongFieldUpdater和AtomicReferenceFieldUpdater

2.5 AtomicIntegerArray、AtomicLongArray和Atomic-ReferenceArray

Lock與Condition

3.1互斥鎖

3.2讀寫鎖

3.3 Condition

3.4 StampedLock

GitHub標星120K+的JDK併發程式設計指南,連續霸榜GitHub終於開源了

同步工具類

4.1 Semaphore

4.2 CountDownl atch

4.3 CyclicBarrier

4.4 Exchanger

4.5 Phaser

併發容器

5.1 BlockingQueue

5.2 BlockingDeque

5.3 CopyOnWrite

5.4 ConcurrentLinkedQueue/Deque

5.5 ConcurrentHashMap

5.6 ConcurrentSkipListMap/Set

執行緒池與Future

6.1執行緒池的實現原理

6.2執行緒池的類繼承體系

6.3 ThreadPoolExector

6.4 Callable與Future

6.5 ScheduledThreadPoolExecutor

6.6 Executors工具類

GitHub標星120K+的JDK併發程式設計指南,連續霸榜GitHub終於開源了

ForkJoinPool

7.1 ForkJoinPool用法

7.2核心資料結構

7.3工作竊取佇列

7.4 ForkJoinPool狀態控制

7.5 Worker執行緒的阻塞喚醒機制

7.6任務的提交過程分析

7.7工作竊取演算法:任務的執行過程分析

7.8 ForkJoinTask的fork/join

7.9 ForkJoinPool的優雅關閉

CompletableFuture

8.1 CompletableFuture用法

8.2四種任務原型

8.3 CompletionStage介面

8.4 CompletableFuture內部原理

8.5任務的網狀執行:有向無環圖

8.6 allOf內部的計算圖分析

GitHub標星120K+的JDK併發程式設計指南,連續霸榜GitHub終於開源了

內容展示

第1章多執行緒基礎

GitHub標星120K+的JDK併發程式設計指南,連續霸榜GitHub終於開源了

第2章Atomic類

GitHub標星120K+的JDK併發程式設計指南,連續霸榜GitHub終於開源了

第3章Lock與Condition

 

GitHub標星120K+的JDK併發程式設計指南,連續霸榜GitHub終於開源了

第4章同步工具類

除了鎖與Condition,Concurrent 包還提供了一系列同步工具類。這些同步工具類的原理,有些也是基於AQS的,有些則需要特殊的實現機制,這一章將對所有同步工具類的實現原理進行剖析。

GitHub標星120K+的JDK併發程式設計指南,連續霸榜GitHub終於開源了

第5章併發容器

GitHub標星120K+的JDK併發程式設計指南,連續霸榜GitHub終於開源了

第6章執行緒池與Future

執行緒池和Future我想不需要做過多的介紹,尤其是執行緒池,無論是面試還是工作,都是一個很重要的知識點

GitHub標星120K+的JDK併發程式設計指南,連續霸榜GitHub終於開源了

第7章ForkJoinPool

ForkJoinPool就是JDK7提供的一種“分治演算法”的多執行緒平行計算框架。Fork意為分叉,Join意為合併,一分一合,相互配合,形成分治演算法。此外,也可以將ForkJoinPool看作一個單機版的Map/Reduce,只不過這裡的並行不是多臺機器平行計算,而是多個執行緒平行計算。

GitHub標星120K+的JDK併發程式設計指南,連續霸榜GitHub終於開源了

第8章CompletableFuture

在探討Completabl eFuture的原理之前,先詳細看一下CompletableFuture的用法,從這些用法中,可以看到相較之前的Future有哪些能力得到了提升。

GitHub標星120K+的JDK併發程式設計指南,連續霸榜GitHub終於開源了

而根據這份文件,我也整理形成一張知識導圖,不過還在完善中,給大家展示一下

GitHub標星120K+的JDK併發程式設計指南,連續霸榜GitHub終於開源了
GitHub標星120K+的JDK併發程式設計指南,連續霸榜GitHub終於開源了

這份思維導圖也分享給大家,大家可以根據自己的情況去有針對性的補充,同樣的,

 

相應的文件跟學習視訊已經準備好了,結合文件一起學習,事半功倍,為了大家能夠更好的面試,新增小助手:msbxq2020免費獲取

關注公眾號:Java架構師聯盟,每日更新技術好文

部分資料已經上傳到我的git倉庫中:有需要的可以下載

https://gitee.com/biwangsheng/mxq

相關文章