3dwoo大學簡體電腦書店
Java高并發核心編程. 卷2, 多線程、鎖、JMM、JUC、高并發設計模式
( 簡體 字)
作者:尼恩類別:1. -> 程式設計 -> JAVA -> Java
出版社:機械工業出版社Java高并發核心編程. 卷2, 多線程、鎖、JMM、JUC、高并發設計模式 3dWoo書號: 54499
詢問書籍請說出此書號!
有庫存
NT售價: 645
出版日:5/1/2021
頁數:484
光碟數:0
站長推薦:
印刷:黑白印刷語系: ( 簡體 字 )
ISBN:9787111679882 加入購物車加到我的最愛 (請先登入會員)
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證, 繁體書的下載亦請直接連絡出版社)
第1章 多執行緒原理與實戰 1
1.1 兩個技術面試故事 1
1.2 無處不在的進程和執行緒 2
1.2.1 進程的基本原理 3
1.2.2 執行緒的基本原理 5
1.2.3 進程與執行緒的區別 8
1.3 創建執行緒的4種方法 8
1.3.1 Thread類詳解 8
1.3.2 創建一個空執行緒 10
1.3.3 執行緒創建方法一:繼承Thread類創建執行緒類 12
1.3.4 執行緒創建方法二:實現Runnable介面創建執行緒目標類 13
1.3.5 優雅創建Runnable執行緒目標類的兩種方式 16
1.3.6 通過實現Runnable介面的方式創建執行緒目標類的優缺點 18
1.3.7 執行緒創建方法三:使用Callable和FutureTask創建執行緒 23
1.3.8 執行緒創建方法四:通過執行緒池創建執行緒 28
1.4 執行緒的核心原理 31
1.4.1 執行緒的調度與時間片 31
1.4.2 執行緒的優先順序 32
1.4.3 執行緒的生命週期 35
1.4.4 一個執行緒狀態的簡單演示案例 37
1.4.5 使用Jstack工具查看執行緒狀態 40
1.5 執行緒的基本操作 41
1.5.1 執行緒名稱的設置和獲取 41
1.5.2 執行緒的sleep操作 43
1.5.3 執行緒的interrupt操作 45
1.5.4 執行緒的join操作 48
1.5.5 執行緒的yield操作 53
1.5.6 執行緒的daemon操作 55
1.5.7 執行緒狀態總結 61
1.6 執行緒池原理與實戰 62
1.6.1 JUC的執行緒池架構 63
1.6.2 Executors的4種快捷創建執行緒池的方法 65
1.6.3 執行緒池的標準創建方式 72
1.6.4 向執行緒池提交任務的兩種方式 73
1.6.5 執行緒池的任務調度流程 77
1.6.6 ThreadFactory(執行緒工廠) 79
1.6.7 任務阻塞佇列 81
1.6.8 調度器的鉤子方法 82
1.6.9 執行緒池的拒絕策略 84
1.6.10 執行緒池的優雅關閉 87
1.6.11 Executors快捷創建執行緒池的潛在問題 93
1.7 確定執行緒池的執行緒數 97
1.7.1 按照任務類型對執行緒池進行分類 97
1.7.2 為IO密集型任務確定執行緒數 98
1.7.3 為CPU密集型任務確定執行緒數 100
1.7.4 為混合型任務確定執行緒數 101
1.8 ThreadLocal原理與實戰 104
1.8.1 ThreadLocal的基本使用 104
1.8.2 ThreadLocal的使用場景 107
1.8.3 使用ThreadLocal進行執行緒隔離 108
1.8.4 使用ThreadLocal進行跨函數資料傳遞 109
1.8.5 ThreadLocal內部結構演進 110
1.8.6 ThreadLocal源碼分析 111
1.8.7 ThreadLocalMap源碼分析 114
1.8.8 ThreadLocal綜合使用案例 119
第2章 Java內置鎖的核心原理 123
2.1 執行緒安全問題 123
2.1.1 自增運算不是執行緒安全的 123
2.1.2 臨界區資源與臨界區程式碼片段 126
2.2 synchronized關鍵字 127
2.2.1 synchronized同步方法 127
2.2.2 synchronized同步塊 128
2.2.3 靜態的同步方法 130
2.3 生產者-消費者問題 131
2.3.1 生產者-消費者模式 131
2.3.2 一個執行緒不安全的實現版本 132
2.3.3 一個執行緒安全的實現版本 139
2.4 Java物件結構與內置鎖 140
2.4.1 Java物件結構 141
2.4.2 Mark Word的結構資訊 143
2.4.3 使用JOL工具查看物件的佈局 145
2.4.4 大小端問題 149
2.4.5 無鎖、偏向鎖、羽量級鎖和重量級鎖 150
2.5 偏向鎖的原理與實戰 152
2.5.1 偏向鎖的核心原理 152
2.5.2 偏向鎖的演示案例 152
2.5.3 偏向鎖的膨脹和撤銷 156
2.6 羽量級鎖的原理與實戰 157
2.6.1 羽量級鎖的核心原理 157
2.6.2 羽量級鎖的演示案例 158
2.6.3 羽量級鎖的分類 161
2.6.4 羽量級鎖的膨脹 162
2.7 重量級鎖的原理與實戰 162
2.7.1 重量級鎖的核心原理 162
2.7.2 重量級鎖的開銷 165
2.7.3 重量級鎖的演示案例 166
2.8 偏向鎖、羽量級鎖與重量級鎖的對比 169
2.9 執行緒間通信 170
2.9.1 執行緒間通信的定義 170
2.9.2 低效的執行緒輪詢 170
2.9.3 wait方法和notify方法的原理 171
2.9.4 “等待-通知”通信模式演示案例 174
2.9.5 生產者-消費者之間的執行緒間通信 177
2.9.6 需要在synchronized同步塊的內部使用wait和notify 180
第3章 CAS原理與JUC原子類 182
3.1 什麼是CAS 182
3.1.1 Unsafe類中的CAS方法 182
3.1.2 使用CAS進行無鎖程式設計 185
3.1.3 使用無鎖程式設計實現羽量級安全自增 186
3.1.4 欄位偏移量的計算 189
3.2 JUC原子類 191
3.2.1 JUC中的Atomic原子操作包 191
3.2.2 基礎原子類AtomicInteger 192
3.2.3 陣列原子類AtomicIntegerArray 194
3.2.4 AtomicInteger執行緒安全原理 195
3.3 物件操作的原子性 198
3.3.1 參考類型原子類 198
3.3.2 屬性更新原子類 200
3.4 ABA問題 201
3.4.1 瞭解ABA問題 201
3.4.2 ABA問題解決方案 203
3.4.3 使用AtomicStampedReference解決ABA問題 203
3.4.4 使用AtomicMarkableReference解決ABA問題 205
3.5 提升高併發場景下CAS操作的性能 207
3.5.1 以空間換時間:LongAdder 208
3.5.2 LongAdder的原理 211
3.6 CAS在JDK中的廣泛應用 218
3.6.1 CAS操作的弊端和規避措施 218
3.6.2 CAS操作在JDK中的應用 219
第4章 可見性與有序性的原理 220
4.1 CPU物理緩存結構 220
4.2 併發程式設計的三大問題 222
4.2.1 原子性問題 222
4.2.2 可見性問題 223
4.2.3 有序性問題 224
4.3 硬體層的MESI協定原理 227
4.3.1 匯流排鎖和緩存鎖 228
4.3.2 MSI協議 230
4.3.3 MESI協定及RFO請求 230
4.3.4 volatile的原理 234
4.4 有序性與記憶體屏障 237
4.4.1 重排序 237
4.4.2 As-if-Serial規則 238
4.4.3 硬體層面的記憶體屏障 240
4.5 JMM詳解 242
4.5.1 什麼是Java記憶體模型 243
4.5.2 JMM與JVM實體記憶體的區別 244
4.5.3 JMM的8個操作 246
4.5.4 JMM如何解決有序性問題 248
4.5.5 volatile語義中的記憶體屏障 250
4.6 Happens-Before規則 251
4.6.1 Happens-Before規則介紹 252
4.6.2 規則1:順序性規則 252
4.6.3 規則2:volatile規則 252
4.6.4 規則3:傳遞性規則 255
4.6.5 規則4:監視鎖規則 255
4.6.6 規則5:start()規則 256
4.6.7 規則6:join()規則 257
4.7 volatile不具備原子性 258
4.7.1 volatile變數的自增實例 258
4.7.2 volatile變數的複合操作不具備原子性的原理 260
第5章 JUC顯式鎖的原理與實戰 262
5.1 顯式鎖 262
5.1.1 顯式鎖Lock介面 263
5.1.2 可重入鎖ReentrantLock 264
5.1.3 使用顯式鎖的範本代碼 267
5.1.4 基於顯式鎖進行“等待-通知”方式的執行緒間通信 269
5.1.5 LockSupport 273
5.1.6 顯式鎖的分類 276
5.2 悲觀鎖和樂觀鎖 279
5.2.1 悲觀鎖存在的問題 279
5.2.2 通過CAS實現樂觀鎖 279
5.2.3 不可重入的自旋鎖 280
5.2.4 可重入的自旋鎖 281
5.2.5 CAS可能導致“匯流排風暴” 283
5.2.6 CLH自旋鎖 285
5.3 公平鎖與非公平鎖 293
5.3.1 非公平鎖實戰 293
5.3.2 公平鎖實戰 295
5.4 可中斷鎖與不可中斷鎖 296
5.4.1 鎖的可中斷搶佔 296
5.4.2 鎖死的監測與中斷 298
5.5 共用鎖與獨佔鎖 302
5.5.1 獨佔鎖 302
5.5.2 共用鎖Semaphore 302
5.5.3 共用鎖CountDownLatch 306
5.6 讀寫鎖 307
5.6.1 讀寫鎖ReentrantReadWriteLock 308
5.6.2 鎖的升級與降級 310
5.6.3 StampedLock 312
第6章 AQS抽象同步器的核心原理 316
6.1 鎖與佇列的關係 316
6.2 AQS的核心成員 318
6.2.1 狀態標誌位元 318
6.2.2 佇列節點類 319
6.2.3 FIFO雙向同步佇列 321
6.2.4 JUC顯式鎖與AQS的關係 322
6.2.5 ReentrantLock與AQS的組合關係 322
6.3 AQS中的範本模式 325
6.3.1 範本模式 325
6.3.2 一個範本模式的參考實現 326
6.3.3 AQS的範本流程 329
6.3.4 AQS中的鉤子方法 329
6.4 通過AQS實現一把簡單的獨佔鎖 331
6.4.1 簡單的獨佔鎖的UML類圖 331
6.4.2 簡單的獨佔鎖的實現 331
6.4.3 SimpleMockLock測試用例 333
6.5 AQS鎖搶佔的原理 335
6.5.1 顯式鎖搶佔的總體流程 335
6.5.2 AQS範本方法:acquire(arg) 336
6.5.3 鉤子實現:tryAcquire(arg) 336
6.5.4 直接入隊:addWaiter 337
6.5.5 自旋入隊:enq 338
6.5.6 自旋搶佔:acquireQueued() 339
6.5.7 掛起預判:shouldParkAfterFailedAcquire() 340
6.5.8 執行緒掛起:parkAndCheckInterrupt() 342
6.6 AQS的兩個關鍵點:節點的入隊和出隊 343
6.6.1 節點的自旋入隊 343
6.6.2 節點的出隊 343
6.7 AQS鎖釋放的原理 345
6.7.1 SimpleMockLock獨佔鎖的釋放流程 345
6.7.2 AQS範本方法:release() 345
6.7.3 鉤子實現:tryRelease() 346
6.7.4 喚醒後繼:unparkSuccessor() 346
6.8 ReentrantLock的搶鎖流程 347
6.8.1 ReentrantLock非公平鎖的搶佔流程 347
6.8.2 非公平鎖的同步器子類 348
6.8.3 非公平搶佔的鉤子方法:tryAcquire(arg) 349
6.8.4 ReentrantLock公平鎖的搶佔流程 350
6.8.5 公平鎖的同步器子類 350
6.8.6 公平搶佔的鉤子方法:tryAcquire(arg) 351
6.8.7 是否有後繼節點的判斷 351
6.9 AQS條件佇列 352
6.9.1 Condition基本原理 352
6.9.2 await()等待方法原理 353
6.9.3 signal()喚醒方法原理 355
6.10 AQS的實際應用 356
第7章 JUC容器類 358
7.1 執行緒安全的同步容器類 358
7.2 JUC高併發容器 360
7.3 CopyOnWriteArrayList 362
7.3.1 CopyOnWriteArrayList的使用 362
7.3.2 CopyOnWriteArrayList的原理 364
7.3.3 CopyOnWriteArrayList 讀取操作 366
7.3.4 CopyOnWriteArrayList寫入操作 366
7.3.5 CopyOnWriteArrayList的反覆運算器實現 367
7.4 BlockingQueue 368
7.4.1 BlockingQueue的特點 368
7.4.2 阻塞佇列的常用方法 368
7.4.3 常見的BlockingQueue 370
7.4.4 ArrayBlockingQueue的基本使用 372
7.4.5 ArrayBlockingQueue構造器和成員 374
7.4.6 非阻塞式添加元素:add()、offer()方法的原理 376
7.4.7 阻塞式添加元素:put()方法的原理 378
7.4.8 非阻塞式刪除元素:poll()方法的原理 380
7.4.9 阻塞式刪除元素:take()方法的原理 381
7.4.10 peek()直接返回當前佇列的頭元素 382
7.5 ConcurrentHashMap 383
7.5.1 HashMap和HashTable的問題 383
7.5.2 JDK 1.7版本ConcurrentHashMap的結構 384
7.5.3 JDK 1.7版本ConcurrentHashMap的核心原理 385
7.5.4 JDK 1.8版本ConcurrentHashMap的結構 393
7.5.5 JDK 1.8版本ConcurrentHashMap的核心原理 395
7.5.6 JDK 1.8版本ConcurrentHashMap的核心源碼 398
第8章 高併發設計模式 402
8.1 執行緒安全的單例模式 402
8.1.1 從餓漢式單例到懶漢式單例 402
8.1.2 使用內置鎖保護懶漢式單例 404
8.1.3 雙重檢查鎖單例模式 404
8.1.4 使用雙重檢查鎖+volatile 405
8.1.5 使用靜態內部類實現懶漢式單例模式 406
8.2 Master-Worker模式 407
8.2.1 Master-Worker模式的參考實現 408
8.2.2 Netty中Master-Worker模式的實現 413
8.2.3 Nginx中Master-Worker模式的實現 414
8.3 ForkJoin模式 415
8.3.1 ForkJoin模式的原理 415
8.3.2 ForkJoin框架 416
8.3.3 ForkJoin框架使用實戰 416
8.3.4 ForkJoin框架的核心API 419
8.3.5 工作竊取演算法 421
8.3.6 ForkJoin框架的原理 423
8.4 生產者-消費者模式 423
8.5 Future模式 424
第9章 高併發核心模式之非同步回檔模式 426
9.1 從泡茶的案例講起 426
9.2 join:非同步阻塞之悶葫蘆 427
9.2.1 執行緒的合併流程 427
9.2.2 調用join()實現非同步泡茶喝 427
9.2.3 join()方法詳解 429
9.3 FutureTask:非同步調用之重武器 430
9.3.1 通過FutureTask獲取非同步執行結果的步驟 431
9.3.2 使用FutureTask實現非同步泡茶喝 431
9.4 非同步回檔與主動調用 434
9.5 Guava的非同步回檔模式 435
9.5.1 詳解FutureCallback 435
9.5.2 詳解ListenableFuture 436
9.5.3 ListenableFuture非同步任務 437
9.5.4 使用Guava實現泡茶喝的實例 438
9.5.5 Guava非同步回檔和Java非同步調用的區別 442
9.6 Netty的非同步回檔模式 442
9.6.1 GenericFutureListener介面詳解 443
9.6.2 Netty的Future介面詳解 443
9.6.3 ChannelFuture的使用 444
9.6.4 Netty的出站和入站非同步回檔 444
9.7 非同步回檔模式小結 445
第10章 CompletableFuture非同步回檔 446
10.1 CompletableFuture詳解 446
10.1.1 CompletableFuture的UML類關係 446
10.1.2 CompletionStage介面 447
10.1.3 使用runAsync和supplyAsync創建子任務 448
10.1.4 設置子任務回檔鉤子 449
10.1.5 調用handle()方法統一處理異常和結果 451
10.1.6 執行緒池的使用 452
10.2 非同步任務的串列執行 453
10.2.1 thenApply()方法 453
10.2.2 thenRun()方法 455
10.2.3 thenAccept()方法 455
10.2.4 thenCompose()方法 456
10.2.5 4個任務串列方法的區別 458
10.3 非同步任務的合併執行 458
10.3.1 thenCombine()方法 458
10.3.2 runAfterBoth()方法 460
10.3.3 thenAcceptBoth()方法 461
10.3.4 allOf()等待所有的任務結束 462
10.4 非同步任務的選擇執行 463
10.4.1 applyToEither()方法 463
10.4.2 runAfterEither()方法 465
10.4.3 acceptEither()方法 465
10.5 CompletableFuture的綜合案例 466
10.5.1 使用CompletableFuture實現泡茶喝實例 466
10.5.2 使用CompletableFuture進行多個RPC調用 468
10.5.3 使用RxJava類比RPC非同步回檔 469
pagetop