前言
在程式設計行業中,有一個東西是和廣大程式設計師形影不離的,在最一開始接觸程式設計就是配置它的執行環境,然後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綜合應用:無鎖程式設計
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
同步工具類
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工具類
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內部的計算圖分析
內容展示
第1章多執行緒基礎
第2章Atomic類
第3章Lock與Condition
第4章同步工具類
除了鎖與Condition,Concurrent 包還提供了一系列同步工具類。這些同步工具類的原理,有些也是基於AQS的,有些則需要特殊的實現機制,這一章將對所有同步工具類的實現原理進行剖析。
第5章併發容器
第6章執行緒池與Future
執行緒池和Future我想不需要做過多的介紹,尤其是執行緒池,無論是面試還是工作,都是一個很重要的知識點
第7章ForkJoinPool
ForkJoinPool就是JDK7提供的一種“分治演算法”的多執行緒平行計算框架。Fork意為分叉,Join意為合併,一分一合,相互配合,形成分治演算法。此外,也可以將ForkJoinPool看作一個單機版的Map/Reduce,只不過這裡的並行不是多臺機器平行計算,而是多個執行緒平行計算。
第8章CompletableFuture
在探討Completabl eFuture的原理之前,先詳細看一下CompletableFuture的用法,從這些用法中,可以看到相較之前的Future有哪些能力得到了提升。
而根據這份文件,我也整理形成一張知識導圖,不過還在完善中,給大家展示一下
這份思維導圖也分享給大家,大家可以根據自己的情況去有針對性的補充,同樣的,
相應的文件跟學習視訊已經準備好了,結合文件一起學習,事半功倍,為了大家能夠更好的面試,新增小助手:msbxq2020免費獲取
關注公眾號:Java架構師聯盟,每日更新技術好文
部分資料已經上傳到我的git倉庫中:有需要的可以下載