Java並發實現原理:JDK源碼剖析

Java並發實現原理:JDK源碼剖析

《Java並發實現原理:JDK源碼剖析》是2020年3月電子工業出版社出版的圖書,作者是余春龍。

基本介紹

  • 中文名:Java並發實現原理:JDK源碼剖析
  • 作者:余春龍
  • 出版時間:2020年3月
  • 出版社:電子工業出版社
  • 頁數:256 頁
  • ISBN:9787121379727
  • 定價:89 元
  • 開本:16 開
內容簡介,圖書目錄,

內容簡介

本書全面而系統地剖析了Java Concurrent包中的每一個部分,對並發的實現原理進行了深刻的探討。全書分為8章,第1章從最基礎的多執行緒知識講起,理清多執行緒中容易誤解的知識點,探究背後的原理,包括記憶體重排序、happen-before、記憶體屏障等;第2~8章,從簡單到複雜,逐個剖析Concurrent包的每個部分,包括原子類、鎖、同步工具類、並發容器、執行緒池、ForkJoinPool、CompletableFuture共7個部分。本書遵循層層遞進的邏輯,後一章建立在前一章的知識點基礎之上,建議讀者由淺入深,逐步深入閱讀。本書適合有一定Java開發經驗的工程師、架構師閱讀。通過本書,讀者可以對多執行緒編程形成一個“深刻而直觀”的認識,而不是再僅僅停留在概念和理論層面。

圖書目錄

第1章 多執行緒基礎 / 1
1.1 執行緒的優雅關閉 / 1
1.1.1 stop與destory函式 / 1
1.1.2 守護執行緒 / 1
1.1.3 設定關閉的標誌位 / 2
1.2 InterruptedException與interrupt( )函式 / 3
1.2.1 什麼情況下會拋出Interrupted異常 / 3
1.2.2 輕量級阻塞與重量級阻塞 / 4
1.2.3 t.isInterrupted( )與Thread.interrupted( )的區別 / 5
1.3 synchronized關鍵字 / 5
1.3.1 鎖的對象是什麼 / 5
1.3.2 鎖的本質是什麼 / 6
1.3.3 synchronized實現原理 / 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實現原理 / 24
1.8 final關鍵字 / 25
1.8.1 構造函式溢出問題 / 25
1.8.2 final的happen-before語義 / 26
1.8.3 happen-before規則總結 / 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 實現原理 / 39
2.6 Striped64與LongAdder / 40
2.6.1 LongAdder原理 / 40
2.6.2 最終一致性 / 41
2.6.3 偽共享與快取行填充 / 42
2.6.4 LongAdder核心實現 / 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 鎖實現的基本原理 / 51
3.1.5 公平與非公平的lock( )實現差異 / 53
3.1.6 阻塞佇列與喚醒機制 / 55
3.1.7 unlock( )實現分析 / 58
3.1.8 lockInterruptibly( )實現分析 / 59
3.1.9 tryLock( )實現分析 / 60
3.2 讀寫鎖 / 60
3.2.1 類繼承層次 / 60
3.2.2 讀寫鎖實現的基本原理 / 61
3.2.3 AQS的兩對模板方法 / 62
3.2.4 WriteLock公平vs.非公平實現 / 65
3.2.5 ReadLock公平vs.非公平實現 / 67
3.3 Condition / 68
3.3.1 Condition與Lock的關係 / 68
3.3.2 Condition的使用場景 / 69
3.3.3 Condition實現原理 / 71
3.3.4 await( )實現分析 / 72
3.3.5 awaitUninterruptibly( )實現分析 / 73
3.3.6 notify( )實現分析 / 74
3.4 StampedLock / 75
3.4.1 為什麼引入StampedLock / 75
3.4.2 使用場景 / 75
3.4.3 “樂觀讀”的實現原理 / 77
3.4.4 悲觀讀/寫:“阻塞”與“自旋”策略實現差異 / 78
第4章 同步工具類 / 83
4.1 Semaphore / 83
4.2 CountDownLatch / 84
4.2.1 CountDownLatch使用場景 / 84
4.2.2 await( )實現分析 / 85
4.2.3 countDown( )實現分析 / 85
4.3 CyclicBarrier / 86
4.3.1 CyclicBarrier使用場景 / 86
4.3.2 CyclicBarrier實現原理 / 87
4.4 Exchanger / 90
4.4.1 Exchanger使用場景 / 90
4.4.2 Exchanger 實現原理 / 91
4.4.3 exchange(V x)實現分析 / 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( )函式分析 / 99
4.5.6 awaitAdvance( )函式分析 / 101
第5章 並發容器 / 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中的實現方式 / 130
5.5.2 JDK 8中的實現方式 / 138
5.6 ConcurrentSkipListMap/Set / 152
5.6.1 ConcurrentSkipListMap / 153
5.6.2 ConcurrentSkipListSet / 162
第6章 執行緒池與Future / 163
6.1 執行緒池的實現原理 / 163
6.2 執行緒池的類繼承體系 / 164
6.3 ThreadPoolExecutor / 165
6.3.1 核心數據結構 / 165
6.3.2 核心配置參數解釋 / 165
6.3.3 執行緒池的優雅關閉 / 167
6.3.4 任務的提交過程分析 / 172
6.3.5 任務的執行過程分析 / 174
6.3.6 執行緒池的4種拒絕策略 / 179
6.4 Callable與Future / 180
6.5 ScheduledThreadPool Executor / 183
6.5.1 延遲執行和周期性執行的原理 / 184
6.5.2 延遲執行 / 184
6.5.3 周期性執行 / 185
6.6 Executors工具類 / 188
第7章 ForkJoinPool / 190
7.1 ForkJoinPool用法 / 190
7.2 核心數據結構 / 193
7.3 工作竊取佇列 / 195
7.4 ForkJoinPool狀態控制 / 198
7.4.1 狀態變數ctl解析 / 198
7.4.2 阻塞棧Treiber Stack / 200
7.4.3 ctl變數的初始值 / 201
7.4.4 ForkJoinWorkerThread狀態與個數分析 / 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 工作竊取算法:任務的執行過程分析 / 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的優雅關閉 / 222
7.9.1 關鍵的terminate變數 / 222
7.9.2 shutdown( )與shutdownNow( )的區別 / 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 任務的鏈式執行過程分析 / 237
8.4.4 thenApply與thenApplyAsync的區別 / 241
8.5 任務的網狀執行:有向無環圖 / 242
8.6 allOf內部的計算圖分析 / 244

相關詞條

熱門詞條

聯絡我們