Java並發程式設計的藝術

方騰飛, 魏鵬, 程曉明著

  • 出版商: 機械工業
  • 出版日期: 2023-12-01
  • 售價: $654
  • 貴賓價: 9.5$621
  • 語言: 簡體中文
  • 頁數: 396
  • 裝訂: 平裝
  • ISBN: 7111737970
  • ISBN-13: 9787111737971
  • 相關分類: Java 程式語言
  • 立即出貨 (庫存 < 3)

買這商品的人也買了...

商品描述

本書共14章,前11章基於JDK的源碼詳細介紹Java並發程式設計基礎、並發程式設計的挑戰、Java並發機制的底層實作原理、
Java記憶體模型、Java中的鎖定、Java並發容器與框架、Java中的原子操作類別、Java中的並發工具類別、Java中的執行緒池、
Executor框架、Java並發程式設計實踐等內容,後3章主要介紹分散式程式設計相關的內容。
本書對原理的剖析並沒有侷限於Java層面,而是深入JVM甚至CPU層面進行解說,幫助讀者從底層看待並發技術。

目錄大綱

Contents目  錄
讚譽 譽
前 言
第1章 Java並發程式設計基礎 1
1.1 線程簡介 1
1.1.1 什麼是線程 1
1.1.2 為什麼要使用多執行緒 2
1.1.3 執行緒優先權 3
1.1.4 線程的狀態 4
1.1.5 Daemon線程 8
1.2 啟動和終止執行緒 8
1.2.1 構造線程 9
1.2.2 啟動線程 9
1.2.3 理解中斷 9
1.2.4 過期的suspend()、resume()和stop() 11
1.2.5 安全地終止執行緒 12
1.3 線程間通信 13
1.3.1 volatile和synchronized關鍵字 13
1.3.2 等待/通知機制 15
1.3.3 等待/通知的經典典範 18
1.3.4 管道輸入/輸出流 19
1.3.5 thread.join()的使用 20
1.3.6 ThreadLocal的使用 22
1.4 執行緒應用實例 23
1.4.1 等待超時模式 23
1.4.2 一個簡單的資料庫連線池範例 23
1.4.3 執行緒池技術及其範例 27
1.4.4 一個基於執行緒池技術的簡單Web伺服器 30
1.5 本章小結 34
第2章 並發程式設計的挑戰 35
2.1 上下文切換 35
2.1.1 多執行緒一定快嗎 35
2.1.2 測試上下文切換次數和時長 37
2.1.3 如何減少上下文切換 37
2.1.4 減少上下文切換實戰 38
2.2 死鎖 39
2.3 資源限制的挑戰 40
2.4 本章小結 41
第3章 Java並發機制的底層實作原理 42
3.1 volatile的應用 42
3.2 synchronized的實現原理與應用 45
3.2.1 Java物件頭 46
3.2.2 鎖的升級與對比 47
3.3 原子操作的實現原理 50
3.4 本章小結 54
第4章 Java記憶體模型 55
4.1 Java記憶體模型基礎 55
4.1.1 並發程式設計模型的兩個關鍵問題 55
4.1.2 Java記憶體模型的抽象結構 56
4.1.3 從原始碼到指令序列的重排序 57
4.1.4 並發程式設計模型的分類 58
4.1.5 happens-before簡介 60
4.2 重排序 61
4.2.1 資料依賴性 62
4.2.2 as-if-serial語意 62
4.2.3 程序順序規則 63
4.2.4 重排序對多執行緒的影響 63
4.3 順序一致性 65
4.3.1 資料競爭與順序一致性 65
4.3.2 順序一致性記憶體模型 66
4.3.3 同步程序的順序一致性效果 68
4.3.4 未同步程式的執行特性 69
4.4 volatile的內存語意 71
4.4.1 volatile的特性 72
4.4.2 volatile寫-讀建立的happens-before關係 73
4.4.3 volatile寫-讀的記憶語語義 74
4.4.4 volatile記憶體語意的實作 76
4.4.5 JSR-133為什麼要增強volatile的記憶體語意 80
4.5 鎖的內存語意 81
4.5.1 鎖的釋放-獲取建立的happens-before關係 81
4.5.2 鎖的釋放和獲取的內存語意 81
4.5.3 鎖記憶體語意的實作 83
4.5.4 concurrent包的實作 87
4.6 final域的記憶體語意 89
4.6.1 final域的重新排序規則 89
4.6.2 寫入final域的重新排序規則 89
4.6.3 讀final域的重排序規則 90
4.6.4 final域為參考型 92
4.6.5 為什麼f?inal引用不能在建構子中「逸出」 93
4.6.6 f?inal語意在處理器中的實作 94
4.6.7 JSR-133為何要增強f?inal的語意 95
4.7 happens-before 95
4.7.1 JMM的設計 95
4.7.2 happens-before的定義 97
4.7.3 happens-before規則 98
4.8 雙重檢查鎖定與延遲初始化 100
4.8.1 雙重檢查鎖定的由來 100
4.8.2 問題的根源 102
4.8.3 基於volatile的解決方案 104
4.8.4 基於類別初始化的解決方案 105
4.9 Java記憶體模型綜述 111
4.9.1 處理器的記憶體模型 111
4.9.2 各種記憶體模型之間的關係 112
4.9.3 JMM的記憶體可見性保證 114
4.9.4 JSR-133對舊記憶體模型的修補 115
4.10 JDK 9記憶體順序模型 115
4.10.1 背景 115
4.10.2 Plain 116
4.10.3 Opaque 116
4.10.4 Release/Acquire 117
4.10.5 volatile 118
4.10.6 總結 118
4.11 本章小結 119
第5章 Java中的鎖 120
5.1 Lock介面 120
5.2 隊列同步器 122
5.2.1 佇列同步器的介面與範例 122
5.2.2 佇列同步器的實作分析 125
5.3 重入鎖 136
5.4 讀寫鎖 141
5.4.1 讀寫鎖的介面與範例 141
5.4.2 讀寫鎖的實現分析 143
5.5 StampedLock 146
5.5.1 StampedLock的介面與範例 147
5.5.2 StampedLock的實現分析 152
5.6 LockSupport工具 160
5.7 Condition接口 161
5.7.1 Condition的介面與範例 162
5.7.2 Condition的實現分析 164
5.8 本章小結 168
第6章 Java並發容器與框架 169
6.1 ConcurrentHashMap的實作原理與使用 169
6.1.1 為什麼要使用ConcurrentHashMap 169
6.1.2 ConcurrentHashMap的結構 170
6.1.3 ConcurrentHashMap的初始化 171
6.1.4 定位Segment 173
6.1.5 ConcurrentHashMap的操作 174
6.1.6 JDK 8中的ConcurrentHashMap 175
6.2 ConcurrentLinkedQueue 175
6.2.1 ConcurrentLinkedQueue的結構 176
6.2.2 入隊列 176
6.2.3 出隊列 179
6.3 Java中的阻塞佇列 181
6.3.1 什麼是阻塞隊列 181
6.3.2 7個阻塞隊列 182
6.3.3 阻塞佇列的實作原理 186
6.4 Fork/Join框架 189
6.4.1 什麼是Fork/Join框架 189
6.4.2 工作竊取演算法 190
6.4.3 Fork/Join框架的設計 190
6.4.4 使用Fork/Join框架 191
6.4.5 Fork/Join框架的異常處理 192
6.4.6 Fork/Join框架的實作原理 193
6.5 本章小結 194
第7章 Java中的13個原子操作類 195
7.1 原子更新基本型態 195
7.2 原子更新數組類型 197
7.3 原子更新引用型別 198
7.4 原子更新字段類型 199
7.5 JDK 8中的原子更新新特性 200
7.6 本章小結 201
第8章 Java中的並發工具類別 202
8.1 等待多執行緒完成的CountDownLatch 202
8.2 同步屏障CyclicBarrier 204
8.2.1 CyclicBarrier簡介 204
8.2.2 CyclicBarrier的應用場景 206
8.2.3 CyclicBarrier與CountDownLatch的區別 208
8.3 控制並發執行緒數的Semaphore 209
8.4 線程間交換資料的Exchanger 210
8.5 本章小結 211
第9章 Java中的執行緒池 212
9.1 執行緒池的實作原理 212
9.2 線程池的使用 215
9.2.1 執行緒池的建立 215
9.2.2 向執行緒池提交任務 216
9.2.3 關閉執行緒池 217
9.2.4 合理地配置執行緒池 217
9.2.5 線程池的監控 218
9.3 本章小結 219
第10章 Executor框架 220
10.1 Executor框架簡介 220
10.1.1 Executor框架的兩層調度模型 220
10.1.2 Executor框架的結構與成員 220
10.2 ThreadPoolExecutor詳解 225
10.2.1 FixedThreadPool詳解 225
10.2.2 SingleThreadExecutor詳解 226
10.2.3 CachedThreadPool詳解 227
10.3 ScheduledThreadPoolExecutor詳解 229
10.3.1 ScheduledThreadPoolExecutor的運作機制 229
10.3.2 ScheduledThreadPoolExecutor的實作 230
10.4 FutureTask詳解 233
10.4.1 FutureTask簡介 233
10.4.2 FutureTask的使用 235
10.4.3 JDK 6的FutureTask實作 236
10.4.4 JDK 8的FutureTask實作 238
10.5 本章小結 243
第11章 Java並發程式設計實踐 244
11.1 生產者與消費者模式 244
11.1.1 生產者與消費者模式實戰 245
11.1.2 多生產者與多元消費者場景 247
11.1.3 線程池與生產者與消費者模式 250
11.2 線上問題定位 250
11.3 效能測試 252
11.4 非同步任務池 254
11.5 本章小結 256
第12章 分散式程式設計基礎 257
12.1 分散式CAP原則 257
12.1.1 CAP原則簡介 257
12.1.2 CAP原則證明 258
12.1.3 CAP原則思考 260
12.2 分散式事務:兩階段提交 262
12.2.1 分散式事務面臨的挑戰 262
12.2.2 拜占庭將軍問題 263
12.2.3 兩階段提交協議 264
12.2.4 兩階段提交的思考 265
12.3 分散式事務:TCC 266
12.3.1 TCC的主要優勢 267
12.3.2 TCC的使用代價 269
12.3.3 支援TCC的Seata 270
12.3.4 一個基於Seata的參考範例 273
12.4 分散式協定:RAFT 279
12.4.1 RAFT的運作流程 279
12.4.2 集群中斷與恢復 280
12.5 分散式協定:Paxos 282
12.5.1 背景 282
12.5.2 Basic Paxos 285
12.5.3 Multi-Paxos 301
12.6 本章小結 306
第13章 分散式鎖 308
13.1 什麼是分散式鎖 308
13.1.1 分散式鎖的定義 308
13.1.2 使用分散式鎖的原因 309
13.1.3 分散式鎖的分類 309
13.2 實現分散式鎖定會遇到的問題 310
13.2.1 效能問題 311
13.2.2 正確性問題 313
13.2.3 可用性問題 313
13.2.4 成本問題 315
13.3 分散式鎖定框架 316
13.3.1 為什麼需要分散式鎖定框架 317
13.3.2 分散式鎖定框架的組成 317
13.3.3 實作:基於Redis的分散式鎖定 321
13.3.4 擴充:分散式鎖定存取日誌 325
13.4 拉模式的分散式鎖 327
13.4.1 什麼是拉模式 327
13.4.2 拉模式需要注意的問題 329
13.4.3 Redis分散式鎖定實現 330<