Java 並發編程深度解析與實戰

譚鋒(Mic)

  • 出版商: 電子工業
  • 出版日期: 2021-10-01
  • 定價: $708
  • 售價: 8.5$602
  • 語言: 簡體中文
  • 頁數: 508
  • ISBN: 7121421364
  • ISBN-13: 9787121421365
  • 相關分類: Java 程式語言
  • 立即出貨 (庫存=1)

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

商品描述

本書涵蓋Java並發編程體系的核心庫和核心類使用及原理分析,具體包括線程、synchronized、volatile、J.U.C中的重入鎖和讀寫鎖、並發中的條件等待機制、J.U.C並發工具集、深度探索並發編程不得不知的工具、阻塞隊列、並發安全集合、線程池、異步編程特性等。書中針對每一個技術點,縱向分析相關的所有內容,並且對相關知識點進行了非常詳細的說明,同時站在架構實踐的角度來看待並發,通過大量實戰案例讓讀者理解各類技術在實際應用中的使用方法。 作者花了4年時間投入了大量精力對並發編程領域做了深入的研究,將自己13年Java開發及架構經驗融入了書中,對於各位讀者來說,這應該是一本非常值得閱讀的圖書。

作者簡介

譚鋒,網名Mic。
咕泡教育聯合創始人,2017年開始創業,至今已有4年多時間。
擁有13年Java開發及架構經驗,其中有4年授課經驗,培養了3萬多名學員,學員遍布一二線主流互聯網企業。
曾就職於中國電信、ping安支付、挖財等公司擔任業務架構師,在ping安支付主導了基於Dubbo的服務化架構設計和落地,在挖財推動了基於Spring Boot微服務化架構的改造。
因此對於微服務架構、高並發架構有非常深入的研究,以及豐富的實踐經驗。
目前擔任教學總監一職,負責微服務及高並發領域的課程研發和設計。

目錄大綱

第1章 Java線程的實踐及原理揭秘 1
1.1 如何理解系統並發 1
1.2 系統如何支撐高並發 2
1.3 線程的前世今生 3
1.3.1 大白話理解進程和線程 3
1.3.2 線程的核心價值 5
1.3.3 如何理解並發和並行 6
1.4 在Java中如何使用多線程 6
1.4.1 實現Runnable接口創建線程 6
1.4.2 繼承Thread類創建線程 7
1.4.3 實現Callable接口並創建帶返回值的線程 7
1.5 多線程如何應用到實際場景 8
1.5.1 ServerSocket 9
1.5.2 SocketThread 10
1.6 多線程的基本原理 11
1.7 線程的運行狀態 11
1.7.1 線程運行狀態演示 12
1.7.2 線程運行狀態流轉圖 14
1.8 如何正確終止線程 15
1.8.1 關於安全中斷線程的思考 17
1.8.2 安全中斷線程之interrupt 17
1.8.3 如何中斷處於阻塞狀態下的線程 18
1.8.4 interrupt()方法的實現原理 21
1.9 理解上下文切換帶來的性能影響 24
1.9.1 上下文切換帶來的影響 25
1.9.2 什麼是上下文切換 27
1.9.3 如何減少上下文切換 29
1.10 揭秘守護線程 30
1.10.1 守護線程的應用場景 32
1.10.2 守護線程使用注意事項 32
1.11 快速定位並解決線程導致的生產問題 33
1.11.1 死鎖導致請求無法響應 35
1.11.2 CPU佔用率很高,響應很慢 36
1.12 本章小結 38

第2章 深度揭秘synchronized實現原理 39
2.1 揭秘多線程環境下的原子性問題 40
2.1.1 深入分析原子性問題的本質 41
2.1.2 關於原子性問題的解決辦法 43
2.2 Java中的synchronized同步鎖 44
2.2.1 synchronized的使用方法 44
2.2.2 了解synchronized同步鎖的作用範圍 45
2.3 關於synchronized同步鎖的思考 49
2.4 synchronzied同步鎖標記存儲分析 49
2.4.1 揭秘Mark Word的存儲結構 50
2.4.2 圖解分析對象的實際存儲 52
2.4.3 通過ClassLayout查看對象內存佈局 53
2.4.4 Hotspot虛擬機中對象存儲的源碼 57
2.5 synchronized的鎖類型 59
2.5.1 偏向鎖的原理分析 60
2.5.2 輕量級鎖的原理分析 64
2.5.3 重量級鎖的原理分析 65
2.6 關於CAS機制的實現原理分析 68
2.6.1 CAS在AtomicInteger中的應用 70
2.6.2 CAS實現自旋鎖 72
2.6.3 CAS在JVM中的實現原理分析 73
2.7 鎖升級的實現流程 76
2.7.1 偏向鎖的實現原理 77
2.7.2 輕量級鎖的實現原理 82
2.7.3 重量級鎖的實現原理 86
2.8 synchronized使用不當帶來的死鎖問題 89
2.8.1 死鎖的案例分析 90
2.8.2 死鎖產生的必要條件 92
2.8.3 如何解決死鎖問題 92
2.9 本章小結 96

第3章 volatile為什麼能解決可見性和有序性問題 97
3.1 關於線程的可見性問題分析 97
3.1.1 思考導致問題的原因 98
3.1.2 volatile關鍵字解決可見性問題 99
3.2 深度理解可見性問題的本質 100
3.2.1 如何#大化提升CPU利用率 100
3.2.2 詳述CPU高速緩存 101
3.2.3 CPU緩存一致性問題 107
3.2.4 總結可見性問題的本質 111
3.3 volatile如何解決可見性問題 112
3.4 指令重排序導致的可見性問題 113
3.4.1 什麼是指令重排序 114
3.4.2 as-if-serial語義 116
3.5 從CPU層面深度剖析指令重排序的本質 117
3.5.1 CPU優化—Store Buffers 117
3.5.2 CPU優化—Store Forwarding 119
3.5.3 CPU優化—Invalidate Queues 122
3.6 通過內存屏障解決內存系統重排序問題 125
3.6.1 內存屏障詳解 125
3.6.2 通過內存屏障防止重排序 127
3.6.3 不同CPU的重排序規則 128
3.6.4 總結CPU層面的可見性問題 129
3.7 Java Memory Mode 129
3.7.1 JVM內存模型和硬件內存模型 130
3.7.2 JVM提供的內存屏障指令 133
3.8 揭秘volatile實現原理 136
3.9 Happens-Before模型 138
3.9.1 程序順序規則 138
3.9.2 傳遞性規則 139
3.9.3 volatile變量規則 139
3.9.4 監視器鎖規則 140
3.9.5  start規則 141
3.9.6 join規則 141
3.10 本章小結 142

第4章 深入淺出J.U.C中的重入鎖和讀寫鎖 143
4.1 J.U.C中與鎖相關的API 143
4.1.1 ReentrantLock的基本應用 144
4.1.2 ReentrantReadWriteLock的基本應用 145
4.1.3 StampedLock的基本應用 147
4.2 ReentrantLock的設計猜想 149
4.2.1 鎖的互斥,必須要競爭同一個共享變量 150
4.2.2 沒有競爭到鎖的線程,需要阻塞 151
4.2.3 需要一個容器存儲被阻塞的線程 151
4.3 ReentrantLock實現原理分析 151
4.4 AbstractQueuedSynchronizer 152
4.5 ReentrantLock源碼分析 154
4.5.1 ReentrantLock.lock() 154
4.5.2 AbstractQueuedSynchronizer.acquire()方法 156
4.5.3  N0nfairSync.tryAcquire()方法 156
4.5.4 ReentrantLock.nofairTryAcquire()方法 157
4.5.5 AbstractQueuedSynchronizer.addWaiter()方法 158
4.5.6 AQS.acquireQueued()方法 159
4.6 ReentrantLock釋放鎖源碼分析 162
4.6.1 ReentrantLock.tryRelease()方法 163
4.6.2 unparkSuccessor()方法 163
4.6.3 釋放鎖的線程繼續執行 164
4.7 分析ReentrantReadWriteLock類的原理 166
4.7.1 WriteLock鎖競爭原理 167
4.7.2 ReadLock鎖競爭原理 170
4.7.3 ReentrantReadWriteLock中的鎖降級 177
4.8 StampedLock的原理分析 179
4.8.1 核心內部類分析 180
4.8.2 StampedLock原理圖解 182
4.8.3 StampedLock鎖升級 184
4.9 本章小結 187

第5章 從線程通信來窺探並發中的條件等待機制 188
5.1 wait/notify 189
5.1.1 wait()/notify()方法使用實戰 189
5.1.2 圖解生產者/消費者 192
5.1.3 wait()/notify()方法的原理 193
5.1.4 wait()/notify()方法為什麼要加同步鎖 195
5.2 通過Thread.join獲取線程執行結果 195
5.2.1 Thread.join()方法的執行流程 196
5.2.2 Thread.join()方法的實現原理 196
5.3 J.U.C中的條件控制Condition 198
5.3.1 Condition的基本應用 199
5.3.2 基於Condition的手寫阻塞隊列 201
5.4 Condition的設計猜想 203
5.5  Condition的源碼分析 203
5.5.1 Condition.await()方法 204
5.5.2 Condition.signal 208
5.5.3 Condition.await()方法 210
5.6 本章小結 213

第6章 J.U.C並發工具集實戰及原理分析 214
6.1 CountDownLatch基本了解 214
6.1.1 CountDownLatch基本使用 215
6.1.2  CountDownLatch運行流程 216
6.1.3 如何落地到實際應用 216
6.1.4 CountDownLatch的其他用法 220
6.2 CountDownLatch的底層原理 221
6.2.1 讓線程等待的await()方法到底做了什麼 222
6.2.2 深入分析countDown()方法源碼 224
6.2.3 線程被喚醒後的執行邏輯 228
6.3 Semaphore 230
6.3.1 Semaphore使用案例 231
6.3.2 Semaphore方法及場景說明 232
6.4 Semaphore原理分析 233
6.4.1 Semaphore令牌獲取過程分析 233
6.4.2 令牌釋放過程分析 236
6.5 CyclicBarrier 237
6.5.1 CyclicBarrier的基本使用 237
6.5.2 基本原理分析 239
6.6 CyclicBarrier原理及源碼 239
6.6.1 await()方法 241
6.6.2 reset() 244
6.7 本章小結 244

第7章 深度探索並發編程不得不知的工具 245
7.1 初步認識ThreadLocal 245
7.2 ThreadLocal的應用場景分析 247
7.3 ThreadLocal解決SimpleDateFormat線程安全問題 249
7.3.1  SimpleDateFormat線程安全問題的原理 250
7.3.2 ThreadLocal實現線程安全性 253
7.4 ThreadLocal實現原理分析 254
7.4.1 set()方法源碼分析 255
7.4.2 get()方法源碼分析 265
7.4.3 ThreadLocal內存洩漏 266
7.5 任務拆分與聚合Fork/Join 269
7.5.1  Fork/Join的核心API說明 269
7.5.2 Fork/Join的基本使用方法 270
7.6  Fork/Join的實現原理 272
7.6.1  WorkQueue的原理 274
7.6.2  工作竊取算法 275
7.7 Fork/Join的核心源碼分析 275
7.7.1  任務提交過程詳解 276
7.7.2 喚醒或者創建工作線程 281
7.7.3 工作線程和工作隊列的綁定 283
7.7.4 ForkJoinWorkerThread運行過程 285
7.8  使用Fork/Join解決實際問題 286
7.8.1 項目結構說明 286
7.8.2 ILoadDataProcessor 287
7.8.3  AbstractLoadDataProcessor 288
7.8.4 業務服務類 288

7.8.5 Item聚合任務服務 289
7.8.6  ComplexTradeTaskService 291
7.8.7  測試代碼 292
7.9 本章小結 293

第8章 深度剖析阻塞隊列的設計原理及實現 294
8.1 什麼是阻塞隊列 294
8.2 Java中提供的阻塞隊列 295
8.3 阻塞隊列中提供的方法 296
8.4 阻塞隊列的使用 297
8.4.1 生產者/消費者模型代碼 297
8.4.2 圖解阻塞隊列實現原理 299
8.5  阻塞隊列應用實戰 299
8.5.1 基於阻塞隊列的責任鏈源碼 300
8.5.2 阻塞隊列實戰場景總結 304
8.6 詳解J.U.C中阻塞隊列的使用 305
8.6.1 基於數組結構的阻塞隊列ArrayBlockingQueue 305
8.6.2 基於鍊錶的阻塞隊列LinkedBlockingQueue 306
8.6.3 優先級阻塞隊列PriorityBlockingQueue 308
8.6.4 延遲阻塞隊列DelayQueue 310
8.6.5 無存儲結構的阻塞隊列SynchronousQueue 314
8.6.6 阻塞隊列結合體LinkedTransferQueue 318
8.6.7 雙向阻塞隊列LinkedBlockingDeque 319
8.7 阻塞隊列的實現原理 321
8.7.1 put()方法說明 321
8.7.2 take()方法說明 324
8.8 本章小結 326

第9章 深度解讀並發安全集合的原理及源碼 327
9.1 並發安全集合ConcurrentHashMap 327
9.2 正確理解ConcurrentHashMap的線程安全性 328
9.2.1 computeIfAbsent()方法詳解 330
9.2.2 computeIfPresent()方法詳解 331
9.2.3 compute()方法詳解 331
9.2.4 merge()方法詳解 332
9.3 ConcurrentHashMap的數據結構 332
9.3.1 ConcurrentHashMap數據存儲相關定義 333
9.3.2 N0de數組初始化過程分析 335
9.3.3 單節點到鍊錶的轉化過程分析 339
9.3.4 擴容還是轉化為紅黑樹 341
9.4 深度分析ConcurrentHashMap中的並發擴容機制 346
9.4.1 多線程並發擴容原理圖解 347
9.4.2 詳解ConcurrentHashMap中的數據遷移 347
9.5 分段鎖設計提高統計元素數量的性能 357
9.5.1 size計數的基本原理分析 358
9.5.2 addCount()方法詳解 358
9.5.3 fullAddCount()方法分析 360
9.6 詳解紅黑樹的實現原理 365
9.6.1 什麼是紅黑樹 365
9.6.2 紅黑樹的ping衡規則 366
9.6.3 紅黑樹的ping衡場景規則說明 368
9.6.4 紅黑樹插入元素ping衡圖解 369
9.6.5  紅黑樹規則實戰解析 373
9.6.6 紅黑樹中刪除元素的ping衡規則 376
9.7 ConcurrentHashMap中紅黑樹的使用 381
9.7.1  TreeBin的基本介紹 383
9.7.2  鍊錶轉化成紅黑樹 384
9.7.3 自ping衡 386
9.7.4 ConcurrentHashMap總結 388
9.8 Java中其他並發安全集合 388
9.8.1 ConcurrentLinkedQueue 388
9.8.2 ConcurrentLinkedDeque 390
9.8.3 ConcurrentSkipListMap 391
9.9 深度分析數據結構:跳表 391
9.9.1 什麼是跳表 392
9.9.2 跳表的特性 392
9.9.3 跳表的基本操作 392
9.10 本章小結 394

第10章 站在架構的角度思考線程池的設計及原理 395
10.1 線程池的優勢 396
10.2 Java中提供的線程池 396
10.2.1 線程池的使用 397
10.2.2 ThreadPoolExecutor 398
10.3 Executor框架詳解 402
10.4 線程池的設計猜想 404
10.4.1 線程池的需求分析 404
10.4.2 生產者/消費者模型的設計 405
10.4.3 任務拒絕策略 406
10.4.4 非核心線程的回收 408
10.4.5 線程池設計總結 408
10.5 從實現原理了解線程池 408
10.6 線程池核心源碼剖析 409
10.6.1 線程狀態和數量存儲 410
10.6.2 線程池的狀態機及變更 412
10.6.3 從execute()方法分析線程池源碼 413
10.7 合理設置線程池參數 425
10.7.1 線程池大小的合理設置 426
10.7.2 動態設置線程池參數 427
10.8 線程池的監控 431
10.8.1 線程池監控的基本原理 432
10.8.2 在Spring Boot應用中發佈線程池信息 433
10.9 本章小結 442

第11章 Java並發編程中的異步編程特性 443
11.1 了解Future/Callable 443
11.2  Future/Callable的實現原理 445
11.2.1 FutureTask的核心屬性 446
11.2.2 FutureTask.run() 447
11.2.3 FutureTask.get() 448
11.2.4 finishCompletion() 452
11.3 Java 8新特性之CompletableFuture 453
11.3.1 CompletableFuture類關係圖 454
11.3.2 CompletableFuture方法說明 454
11.3.3 主動獲取執行結果 458
11.4 CompletionStage方法及作用說明 459
11.4.1 方法分類概述 460
11.4.2 CompletionStage異常處理方法 466
11.4.3 方法類型總結 470
11.5 CompletableFuture綜合實戰 470
11.5.1 商品實體對象 470
11.5.2 模擬微服務請求實現類 471
11.5.3 Web請求 472
11.6 CompletableFuture實現原理分析 474
11.6.1 Completion說明 476
11.6.2 圖解Completion的棧結構 477
11.7 核心源碼分析 480
11.7.1 CompletableFuture靜態任務創建 480
11.7.2  Completion Stack構建 482
11.7.3 簡述UniCompletion 484
11.7.4 任務執行流程 486
11.7.5 獲取任務執行結果 487
11.8 本章小結 491