前言
並行程式設計可選擇的方式有多程序、多執行緒和多協程。對於Java來說,它既不像C++那樣,在執行中呼叫Linux的系統API去「fork」出多個程序;也不像Go那樣,在語言層面原生提供多協程。在Java中,並行就是多執行緒模式。
本文基於JDK 7和JDK 8,對整個Concurrent包進行全面的原始碼剖析。JDK 8中大部分並行功能的實現和JDK 7一樣,但新增了一些額外特性。例如CompletableFuture、ConcurrentHashMap的新實現、StampedLock、LongAdder等。
對整個Concurrent包的原始碼進行分析,有以下幾個目的:
- (1)幫助使用者合理地選擇解決方案。Concurrent包很龐大,有各式各樣的執行緒互斥與同步機制。明白實現原理,使用者可以根據自己的業務場景,選擇最適合自己的解決方案。避免重複造輪子,也避免因為使用不當而掉到「坑」裡。
- (2)對原始碼的分析,將讓使用者對記憶體屏障、CAS原子操作、鎖、無鎖等底層原理的認識,不再停留於一個「似是而非」的階段,而是深刻地認識其本質。
- (3)吸收借鑑大師的思維。在 Concurrent 包中,可以看到各種巧妙的並行處理策略。看了Concurrent包,才會發現在多執行緒中,不是隻有簡陋的互斥鎖、通知機制和執行緒池。
本文將從多執行緒基礎知識講起,逐步地深入整個Concurrent包。讀完本書,你將對多執行緒的原理、各種並行的設計原理有一個全面而深刻的理解。
第1章 多執行緒基礎
- 1.1 執行緒的優雅關閉
- 1.2 InterruptedException()函數與interrupt()函數
- 1.3 synchronized關鍵字
- 1.4 wait()與notify()
- 1.5 volatile關鍵字
- 1.6 JMM與happen-before
- 1.7 記憶體屏障
- 1.8 final關鍵字
- 1.9 綜合應用:無鎖程式設計
第2章 Atomic類
從本章開始,我們將從簡單到複雜,從底層到上層,一步步剖析整個 Concurrent 包的層次體系,如圖所示:
- 2.1 AtomicInteger和AtomicLong
- 2.2 AtomicBoolean和AtomicReference
- 2.3 AtomicStampedReference和AtomicMarkableReference
- 2.4 AtomicIntegerFieldUpdater、AtomicLongFieldUpdater和AtomicReferenceFieldUpdater
- 2.5 AtomicIntegerArray、AtomicLongArray和Atomic-ReferenceArray
- 2.6 Striped64與LongAdder
第3章 Lock與Condition
- 3.1 互斥鎖
- 3.2 讀寫鎖
- 3.3 Condition
- 3.4 StampedLock
第4章 同步工具類
除了鎖與 Condition,Concurrent 包還提供了一系列同步工具類。這些同步工具類的原理,有些也是基於AQS的,有些則需要特殊的實現機制,這一章將對所有同步工具類的實現原理進行剖析。
- 4.1 Semaphore
- 4.2 CountDownLatch
- 4.3 CyclicBarrier
- 4.4 Exchanger
- 4.5 Phaser
第5章 並行容器
在Lock和Phaser的實現中,已經介紹了基於CAS實現的無鎖佇列和無鎖棧。本章將全面介紹Concurrent包提供的各種並行容器。
- 5.1 BlockingQueue
- 5.2 BlockingDeque
- 5.3 CopyOnWrite
- 5.4 ConcurrentLinkedQueue/Deque
- 5.5 ConcurrentHashMap
- 5.6 ConcurrentSkipListMap/Set
第6章 執行緒池與Future
- 6.1 執行緒池的實現原理
- 6.2 執行緒池的類繼承體系
- 6.3 ThreadPoolExector
- 6.4 Callable與Future
- 6.5 ScheduledThreadPoolExecutor
- 6.6 Executors工具類
第7章 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的優雅關閉
第8章 CompletableFuture
從JDK 8開始,在Concurrent包中提供了一個強大的非同步程式設計工具CompletableFuture。在JDK8之前,非同步程式設計可以通過執行緒池和Future來實現,但功能還不夠強大。CompletableFuture的出現,使Java的非同步程式設計能力向前邁進了一大步。在探討CompletableFuture的原理之前,先詳細看一下CompletableFuture的用法,從這些用法中,可以看到相較之前的Future有哪些能力得到了提升。
- 8.1 CompletableFuture用法
- 8.2 四種任務原型
- 8.3 CompletionStage介面
- 8.4 CompletableFuture內部原理
- 8.5 任務的網狀執行:有向無環圖
- 8.6 allOf內部的計算圖分析
由於文章篇幅原因,完整檔案不能全部上傳;這裡只能上傳部分,有需要的朋友可以關注轉發一下後,私聊我:「666」即可免費獲取到
專家推薦
軟體架構設計:大型網站技術架構與業務架構融合之道
這兩份阿里大牛編寫的【軟體架構設計:大型網站技術架構與業務架構融合之道】+【Java並行實現原理:JDK原始碼剖析】兩份資料一共641頁,因為內容實在是太多了,咱們在這裡就不做過多的介紹啦,需要完整版的朋友,可以一鍵三連此文,「加我VX小助理即可免費獲取到」!
軟體架構設計:大型網站技術架構與業務架構融合之道:目錄如下