Java并發(fā)實現(xiàn)原理:JDK源碼剖析
定 價:89 元
- 作者:余春龍
- 出版時間:2020/3/1
- ISBN:9787121379727
- 出 版 社:電子工業(yè)出版社
- 中圖法分類:TP312.8
- 頁碼:256
- 紙張:
- 版次:01
- 開本:16開
本書全面而系統(tǒng)地剖析了Java Concurrent包中的每一個部分,對并發(fā)的實現(xiàn)原理進行了深刻的探討。全書分為8章,第1章從最基礎的多線程知識講起,理清多線程中容易誤解的知識點,探究背后的原理,包括內存重排序、happen-before、內存屏障等;第2~8章,從簡單到復雜,逐個剖析Concurrent包的每個部分,包括原子類、鎖、同步工具類、并發(fā)容器、線程池、ForkJoinPool、CompletableFuture共7個部分。本書遵循層層遞進的邏輯,后一章建立在前一章的知識點基礎之上,建議讀者由淺入深,逐步深入閱讀。本書適合有一定Java開發(fā)經(jīng)驗的工程師、架構師閱讀。通過本書,讀者可以對多線程編程形成一個“深刻而直觀”的認識,而不是再僅僅停留在概念和理論層面。
中科院軟件所計算機碩士畢業(yè)。熱衷于高并發(fā)高可用架構、業(yè)務建模、領域驅動設計,在十年的工作中,經(jīng)歷過游戲、社交、廣告、電商等各種類型的項目,積累了較豐富的工程經(jīng)驗。
第1章 多線程基礎 / 1
1.1 線程的優(yōu)雅關閉 / 1
1.1.1 stop與destory函數(shù) / 1
1.1.2 守護線程 / 1
1.1.3 設置關閉的標志位 / 2
1.2 InterruptedException與interrupt()函數(shù) / 3
1.2.1 什么情況下會拋出Interrupted異常 / 3
1.2.2 輕量級阻塞與重量級阻塞 / 4
1.2.3 t.isInterrupted()與Thread.interrupted()的區(qū)別 / 5
1.3 synchronized關鍵字 / 5
1.3.1 鎖的對象是什么 / 5
1.3.2 鎖的本質是什么 / 6
1.3.3 synchronized實現(xiàn)原理 / 7
1.4 wait與notify / 7
1.4.1 生產者?消費者模型 / 7
1.4.2 為什么必須和synchornized一起使用 / 8
1.4.3 為什么wait()的時候必須釋放鎖 / 9
1.4.4 wait()與notify()的問題 / 10
1.5 volatile關鍵字 / 11
1.5.1 64位寫入的原子性(Half Write) / 11
1.5.2 內存可見性 / 11
1.5.3 重排序:DCL問題 / 12
1.6 JMM與happen-before / 13
1.6.1 為什么會存在“內存可見性”問題 / 13
1.6.2 重排序與內存可見性的關系 / 15
1.6.3 as-if-serial語義 / 16
1.6.4 happen-before是什么 / 17
1.6.5 happen-before的傳遞性 / 18
1.6.6 C++中的volatile關鍵字 / 19
1.6.7 JSR-133對volatile語義的增強 / 20
1.7 內存屏障 / 20
1.7.1 Linux中的內存屏障 / 21
1.7.2 JDK中的內存屏障 / 23
1.7.3 volatile實現(xiàn)原理 / 24
1.8 final關鍵字 / 25
1.8.1 構造函數(shù)溢出問題 / 25
1.8.2 final的happen-before語義 / 26
1.8.3 happen-before規(guī)則總結 / 26
1.9 綜合應用:無鎖編程 / 27
1.9.1 一寫一讀的無鎖隊列:內存屏障 / 27
1.9.2 一寫多讀的無鎖隊列:volatile關鍵字 / 27
1.9.3 多寫多讀的無鎖隊列:CAS / 28
1.9.4 無鎖棧 / 28
1.9.5 無鎖鏈表 / 28
第2章 Atomic類 / 29
2.1 AtomicInteger和AtomicLong / 29
2.1.1 悲觀鎖與樂觀鎖 / 31
2.1.2 Unsafe 的CAS詳解 / 31
2.1.3 自旋與阻塞 / 32
2.2 AtomicBoolean和AtomicReference / 33
2.2.1 為什么需要AtomicBoolean / 33
2.2.2 如何支持boolean和double類型 / 33
2.3 AtomicStampedReference和AtomicMarkable Reference / 34
2.3.1 ABA問題與解決辦法 / 34
2.3.2 為什么沒有AtomicStampedInteger或AtomictStampedLong / 35
2.3.3 AtomicMarkableReference / 36
2.4 AtomicIntegerFieldUpdater、AtomicLongFieldUpdater和AtomicReferenceField Updater / 37
2.4.1 為什么需要AtomicXXXFieldUpdater / 37
2.4.2 限制條件 / 38
2.5 AtomicIntegerArray、AtomicLongArray和
AtomicReferenceArray / 38
2.5.1 使用方式 / 38
2.5.2 實現(xiàn)原理 / 39
2.6 Striped64與LongAdder / 40
2.6.1 LongAdder原理 / 40
2.6.2 最終一致性 / 41
2.6.3 偽共享與緩存行填充 / 42
2.6.4 LongAdder核心實現(xiàn) / 43
2.6.5 LongAccumulator / 47
2.6.6 DoubleAdder與DoubleAccumulator / 47
第3章 Lock與Condition / 49
3.1 互斥鎖 / 49
3.1.1 鎖的可重入性 / 49
3.1.2 類繼承層次 / 49
3.1.3 鎖的公平性vs.非公平性 / 51
3.1.4 鎖實現(xiàn)的基本原理 / 51
3.1.5 公平與非公平的lock()實現(xiàn)差異 / 53
3.1.6 阻塞隊列與喚醒機制 / 55
3.1.7 unlock()實現(xiàn)分析 / 58
3.1.8 lockInterruptibly()實現(xiàn)分析 / 59
3.1.9 tryLock()實現(xiàn)分析 / 60
3.2 讀寫鎖 / 60
3.2.1 類繼承層次 / 60
3.2.2 讀寫鎖實現(xiàn)的基本原理 / 61
3.2.3 AQS的兩對模板方法 / 62
3.2.4 WriteLock公平vs.非公平實現(xiàn) / 65
3.2.5 ReadLock公平vs.非公平實現(xiàn) / 67
3.3 Condition / 68
3.3.1 Condition與Lock的關系 / 68
3.3.2 Condition的使用場景 / 69
3.3.3 Condition實現(xiàn)原理 / 71
3.3.4 await()實現(xiàn)分析 / 72
3.3.5 awaitUninterruptibly()實現(xiàn)分析 / 73
3.3.6 notify()實現(xiàn)分析 / 74
3.4 StampedLock / 75
3.4.1 為什么引入StampedLock / 75
3.4.2 使用場景 / 75
3.4.3 “樂觀讀”的實現(xiàn)原理 / 77
3.4.4 悲觀讀/寫:“阻塞”與“自旋”策略實現(xiàn)差異 / 78
第4章 同步工具類 / 83
4.1 Semaphore / 83
4.2 CountDownLatch / 84
4.2.1 CountDownLatch使用場景 / 84
4.2.2 await()實現(xiàn)分析 / 85
4.2.3 countDown()實現(xiàn)分析 / 85
4.3 CyclicBarrier / 86
4.3.1 CyclicBarrier使用場景 / 86
4.3.2 CyclicBarrier實現(xiàn)原理 / 87
4.4 Exchanger / 90
4.4.1 Exchanger使用場景 / 90
4.4.2 Exchanger 實現(xiàn)原理 / 91
4.4.3 exchange(V x)實現(xiàn)分析 / 92
4.5 Phaser / 94
4.5.1 用Phaser替代CyclicBarrier和CountDownLatch / 94
4.5.2 Phaser新特性 / 95
4.5.3 state變量解析 / 96
4.5.4 阻塞與喚醒(Treiber Stack) / 98
4.5.5 arrive()函數(shù)分析 / 99
4.5.6 awaitAdvance()函數(shù)分析 / 101
第5章 并發(fā)容器 / 104
5.1 BlockingQueue / 104
5.1.1 ArrayBlockingQueue / 105
5.1.2 LinkedBlockingQueue / 106
5.1.3 PriorityBlockingQueue / 109
5.1.4 DelayQueue / 111
5.1.5 SynchronousQueue / 113
5.2 BlockingDeque / 121
5.3 CopyOnWrite / 123
5.3.1 CopyOnWriteArrayList / 123
5.3.2 CopyOnWriteArraySet / 124
5.4 ConcurrentLinkedQueue/ Deque / 125
5.5 ConcurrentHashMap / 130
5.5.1 JDK 7中的實現(xiàn)方式 / 130
5.5.2 JDK 8中的實現(xiàn)方式 / 138
5.6 ConcurrentSkipListMap/Set / 152
5.6.1 ConcurrentSkipListMap / 153
5.6.2 ConcurrentSkipListSet / 162
第6章 線程池與Future / 163
6.1 線程池的實現(xiàn)原理 / 163
6.2 線程池的類繼承體系 / 164
6.3 ThreadPoolExecutor / 165
6.3.1 核心數(shù)據(jù)結構 / 165
6.3.2 核心配置參數(shù)解釋 / 165
6.3.3 線程池的優(yōu)雅關閉 / 167
6.3.4 任務的提交過程分析 / 172
6.3.5 任務的執(zhí)行過程分析 / 174
6.3.6 線程池的4種拒絕策略 / 179
6.4 Callable與Future / 180
6.5 ScheduledThreadPool Executor / 183
6.5.1 延遲執(zhí)行和周期性執(zhí)行的原理 / 184
6.5.2 延遲執(zhí)行 / 184
6.5.3 周期性執(zhí)行 / 185
6.6 Executors工具類 / 188
第7章 ForkJoinPool / 190
7.1 ForkJoinPool用法 / 190
7.2 核心數(shù)據(jù)結構 / 193
7.3 工作竊取隊列 / 195
7.4 ForkJoinPool狀態(tài)控制 / 198
7.4.1 狀態(tài)變量ctl解析 / 198
7.4.2 阻塞棧Treiber Stack / 200
7.4.3 ctl變量的初始值 / 201
7.4.4 ForkJoinWorkerThread狀態(tài)與個數(shù)分析 / 201
7.5 Worker線程的阻塞-喚醒機制 / 202
7.5.1 阻塞–入棧 / 202
7.5.2 喚醒–出棧 / 204
7.6 任務的提交過程分析 / 205
7.6.1 內部提交任務pushTask / 206
7.6.2 外部提交任務
addSubmission / 206
7.7 工作竊取算法:任務的執(zhí)行過程分析 / 207
7.7.1 順序鎖 SeqLock / 209
7.7.2 scanGuard解析 / 210
7.8 ForkJoinTask的fork/join / 212
7.8.1 fork / 213
7.8.2 join的層層嵌套 / 213
7.9 ForkJoinPool的優(yōu)雅關閉 / 222
7.9.1 關鍵的terminate變量 / 222
7.9.2 shutdown()與shutdownNow()的區(qū)別 / 223
第8章 CompletableFuture / 226
8.1 CompletableFuture用法 / 226
8.1.1 最簡單的用法 / 226
8.1.2 提交任務:runAsync與supplyAsync / 226
8.1.3 鏈式的CompletableFuture:thenRun、thenAccept和thenApply / 227
8.1.4 CompletableFuture的組合:thenCompose與thenCombine / 229
8.1.5 任意個CompletableFuture的組合 / 231
8.2 四種任務原型 / 233
8.3 CompletionStage接口 / 233
8.4 CompletableFuture內部原理 / 234
8.4.1 CompletableFuture的構造:ForkJoinPool / 234
8.4.2 任務類型的適配 / 235
8.4.3 任務的鏈式執(zhí)行過程分析 / 237
8.4.4 thenApply與thenApplyAsync的區(qū)別 / 241
8.5 任務的網(wǎng)狀執(zhí)行:有向無環(huán)圖 / 242
8.6 allOf內部的計算圖分析 / 244