会员   密码 您忘记密码了吗?
1,571,551 本书已上架      购物流程 | 常见问题 | 联系我们 | 关于我们 | 用户协议

有店 App


当前分类

商品分类

浏览历史

当前位置: 首页 > 简体书 > Java高併發核心編程(卷2 加強版)--多線程、鎖、JMM、JUC、高併發設計模式
Java高併發核心編程(卷2 加強版)--多線程、鎖、JMM、JUC、高併發設計模式
上一张
下一张
prev next

Java高併發核心編程(卷2 加強版)--多線程、鎖、JMM、JUC、高併發設計模式

作者: 尼恩,唐歡,孫精科,朱達華
出版社: 清華大學出版社
出版日期: 2022-11-01
商品库存: 点击查询库存
以上库存为海外库存属流动性。
可选择“空运”或“海运”配送,空运费每件商品是RM14。
配送时间:空运约8~12个工作天,海运约30个工作天。
(以上预计配送时间不包括出版社库存不足需调货及尚未出版的新品)
定价:   NT708.00
市场价格: RM127.28
本店售价: RM113.28
促销价: RM112.01
剩余时间: 请稍等, 正在载入中...
购买数量:
collect Add to cart Add booking
详细介绍 商品属性 商品标记
內容簡介

本書聚焦Java高併發編程基礎知識,介紹Java多執行緒、執行緒池、內置鎖、JMM、CAS、JUC、高併發設計模式等併發編程方面的核心原理和實戰知識。

本書共10章。第1、2章剖析多執行緒、執行緒池的核心原理和實戰應用,揭秘執行緒安全問題和Java內置鎖的核心原理。第3、4章講解CAS原理與JUC原子類、JMM的核心原理,揭秘CAS操作的弊端和兩類規避措施,以及Java記憶體可見性和volatile關鍵字的底層知識。第5章講解JUC顯式鎖的原理和各種顯式鎖的使用。第6章闡述JUC高併發的基礎設施——AQS抽象同步器的核心原理。第7章介紹JUC容器類。第8~10章介紹常見的Java高併發設計模式的原理和使用。本書既可以作為Java工程師、架構師的編程參考書,又可以作為參加互聯網大廠面試、筆試的人員的學習參考書。


作者介紹

尼 恩

中南大學碩士,資深系統架構師、IT領域資深作家、著名博主、從業十餘年,先後在華為、神州數碼等公司從事技術研發、架構工作。長期專注於高性能Web平臺、高性能通信、高性能搜索、數據挖掘等領域的3高架構研究、架構實操、核心代碼開發工作,以及核心中介軟體、底層源碼研究工作,負責過多個億級RMB智慧城市平臺、大型政務平臺、數據中台架構、技術中台架構工作,發起的3高研究社群“瘋狂創客圈”目前有研究人員1100多人。

唐 歡

計算機專業碩士,資深系統架構師、資深博主,擁有多年Java開發和系統架構經驗,多年敏捷開發的項目管理經驗,現在國內科技企業擔任系統架構師一職,主持企業軟體的系統架構和產品研發工作。

孫精科

南京理工大學計算機專業碩士,上海交通大學EMBA。行業內知名資訊化系統專家,具有豐富的大型資訊系統的研發及管理經驗。近10年來,主持上市公司資訊系統建設、三維開發、通信協議轉換、數據採集、軟硬體一體化產品的研發。具有豐富的國際國內專案諮詢經驗,擔任多項省級專案負責人,主持的多個項目獲得省部級獎項;2003—2008年,在東南亞、中東、非洲、南美等地執行國際諮詢項目。

朱達華

資深技術總監、美國協會PMI專案管理師、敏捷教練。近10年來在一線主持技術管理工作,擅長系統架構分析和設計,負責過多個大型省市級系統建設,服務數千萬的使用者。
 


目錄

第1章 多執行緒原理與實戰 1
1.1 兩個技術面試故事 1
1.2 無處不在的進程和執行緒 2
1.2.1 進程的基本原理 3
1.2.2 執行緒的基本原理 4
1.2.3 進程與執行緒的區別 7
1.3 創建執行緒的4種方法 7
1.3.1 Thread類詳解 8
1.3.2 創建一個空執行緒 10
1.3.3 執行緒創建方法一:繼承Thread類創建執行緒類 11
1.3.4 執行緒創建方法二:實現Runnable介面創建執行緒目標類 12
1.3.5 優雅創建Runnable執行緒目標類的兩種方式 14
1.3.6 實現Runnable介面的方式創建執行緒目標類的優缺點 16
1.3.7 執行緒創建方法三:使用Callable和FutureTask創建執行緒 20
1.3.8 執行緒創建方法四:通過執行緒池創建執行緒 25
1.4 執行緒的核心原理 28
1.4.1 執行緒的調度與時間片 28
1.4.2 執行緒的優先順序 29
1.4.3 執行緒的生命週期 31
1.4.4 一個執行緒狀態的簡單演示案例 33
1.4.5 使用Jstack工具查看執行緒狀態 35
1.5 執行緒的基本操作 36
1.5.1 執行緒名稱的設置和獲取 36
1.5.2 執行緒的sleep操作 38
1.5.3 執行緒的interrupt操作 39
1.5.4 執行緒的join操作 42
1.5.5 執行緒的yield操作 46
1.5.6 執行緒的daemon操作 48
1.5.7 執行緒狀態總結 52
1.6 執行緒池原理與實戰 54
1.6.1 JUC的執行緒池架構 54
1.6.2 Executors的4種快捷創建執行緒池的方法 56
1.6.3 執行緒池的標準創建方式 62
1.6.4 向執行緒池提交任務的兩種方式 63
1.6.5 執行緒池的任務調度流程 66
1.6.6 ThreadFactory(執行緒工廠) 68
1.6.7 任務阻塞佇列 70
1.6.8 調度器的鉤子方法 70
1.6.9 執行緒池的拒絕策略 72
1.6.10 執行緒池的優雅關閉 75
1.6.11 Executors快捷創建執行緒池的潛在問題 80
1.7 確定執行緒池的執行緒數 83
1.7.1 按照任務類型對執行緒池進行分類 83
1.7.2 為IO密集型任務確定執行緒數 84
1.7.3 為CPU密集型任務確定執行緒數 86
1.7.4 為混合型任務確定執行緒數 87
1.8 ThreadLocal原理與實戰 89
1.8.1 ThreadLocal的基本使用 89
1.8.2 ThreadLocal使用場景 91
1.8.3 使用ThreadLocal進行執行緒隔離 92
1.8.4 使用ThreadLocal進行跨函數資料傳遞 93
1.8.5 ThreadLocal內部結構演進 94
1.8.6 ThreadLocal源碼分析 96
1.8.7 ThreadLocalMap源碼分析 99
1.8.8 ThreadLocal綜合使用案例 102

第2章 Java內置鎖的核心原理 106
2.1 執行緒安全問題 106
2.1.1 自增運算不是執行緒安全的 106
2.1.2 臨界區資源與臨界區程式碼片段 108
2.2 synchronized關鍵字 109
2.2.1 synchronized同步方法 110
2.2.2 synchronized同步塊 110
2.2.3 靜態的同步方法 112
2.3 生產者-消費者問題 113
2.3.1 生產者-消費者模式 113
2.3.2 一個執行緒不安全的實現版本 114
2.3.3 一個執行緒安全的實現版本 120
2.4 Java物件結構與內置鎖 121
2.4.1 Java物件結構 121
2.4.2 Mark Word的結構資訊 124
2.4.3 使用JOL工具查看物件的佈局 126
2.4.4 大小端問題 129
2.4.5 無鎖、偏向鎖、羽量級鎖和重量級鎖 131
2.5 偏向鎖的原理與實戰 132
2.5.1 偏向鎖的核心原理 132
2.5.2 偏向鎖的演示案例 133
2.5.3 偏向鎖的膨脹和撤銷 136
2.5.4 全域安全點原理和偏向鎖撤銷的性能問題 137
2.6 羽量級鎖的原理與實戰 139
2.6.1 羽量級鎖的核心原理 139
2.6.2 羽量級鎖的案例演示 141
2.6.3 羽量級鎖的分類 143
2.6.4 羽量級鎖的膨脹 144
2.7 重量級鎖的原理與實戰 144
2.7.1 重量級鎖的核心原理 144
2.7.2 重量級鎖的開銷 146
2.7.3 重量級鎖的演示案例 147
2.8 偏向鎖、羽量級鎖與重量級鎖的對比 149
2.9 執行緒間通信 150
2.9.1 執行緒間通信定義 150
2.9.2 低效的執行緒輪詢 150
2.9.3 wait方法、notify方法的原理 152
2.9.4 “等待-通知”通信模式演示案例 154
2.9.5 生產者-消費者之間的執行緒間通信 156
2.9.6 需要在synchronized同步塊的內部使用wait和notify 158

第3章 CAS原理與JUC原子類 160
3.1 什麼是CAS 160
3.1.1 Unsafe類中的CAS方法 160
3.1.2 使用CAS進行無鎖程式設計 162
3.1.3 使用無鎖程式設計實現羽量級安全自增 164
3.1.4 欄位偏移量的計算 165
3.2 JUC原子類 167
3.2.1 JUC中的Atomic原子操作包 167
3.2.2 基礎原子類AtomicInteger 168
3.2.3 陣列原子類AtomicIntegerArray 170
3.2.4 AtomicInteger執行緒安全原理 171
3.3 物件操作的原子性 173
3.3.1 參考類型原子類 173
3.3.2 屬性更新原子類 174
3.4 ABA問題 175
3.4.1 瞭解ABA問題 175
3.4.2 ABA問題解決方案 177
3.4.3 使用AtomicStampedReference解決ABA問題 177
3.4.4 使用AtomicMarkableReference解決ABA問題 179
3.5 提升高併發場景下CAS操作的性能 180
3.5.1 以空間換時間:LongAdder 181
3.5.2 LongAdder的原理 183
3.6 CAS在JDK中的廣泛應用 189
3.6.1 CAS操作的弊端和規避措施 190
3.6.2 CAS操作在JDK中的應用 191

第4章 可見性與有序性原理 192
4.1 CPU物理緩存結構 192
4.2 併發程式設計的三大問題 194
4.2.1 原子性問題 194
4.2.2 可見性問題 195
4.2.3 有序性問題 196
4.3 硬體層的MESI協定原理 198
4.3.1 匯流排鎖和緩存鎖 199
4.3.2 MSI協議 201
4.3.3 MESI協定及RFO請求 201
4.3.4 Store Buffer和Invalidate Queue 206
4.3.5 volatile的原理 207
4.4 有序性與記憶體屏障 209
4.4.1 重排序 210
4.4.2 As-if-Serial規則 211
4.4.3 硬體層面的記憶體屏障 212
4.5 JMM詳解 214
4.5.1 什麼是Java記憶體模型 214
4.5.2 JMM與JMM實體記憶體的區別 216
4.5.3 JMM的8個操作 218
4.5.4 JMM如何解決有序性問題 219
4.6 Happens-Before規則 222
4.6.1 Happens-Before規則介紹 222
4.6.2 規則1:順序性規則 223
4.6.3 規則2:volatile規則 223
4.6.4 規則3:傳遞性規則 225
4.6.5 規則4:監視鎖規則 226
4.6.6 規則5:start()規則 227
4.6.7 規則6:join()規則 227
4.7 volatile語義中的記憶體屏障 228
4.7.1 volatile寫操作的記憶體屏障 229
4.7.2 volatile讀操作的記憶體屏障 229
4.7.3 對volatile變數的寫入進行性能優化 230
4.8 volatile不具備原子性 232
4.8.1 volatile變數的自增實例 232
4.8.2 volatile變數的複合操作不具備原子性的原理 233

第5章 JUC顯式鎖的原理與實戰 235
5.1 顯式鎖 235
5.1.1 顯式鎖Lock介面 236
5.1.2 可重入鎖ReentrantLock 237
5.1.3 使用顯式鎖的範本代碼 239
5.1.4 基於顯式鎖進行“等待-通知”方式的執行緒間通信 241
5.1.5 LockSupport 244
5.1.6 顯式鎖的分類 247
5.2 悲觀鎖和樂觀鎖 249
5.2.1 悲觀鎖存在的問題 249
5.2.2 通過CAS實現樂觀鎖 249
5.2.3 不可重入的自旋鎖 250
5.2.4 可重入的自旋鎖 251
5.2.5 CAS可能導致“匯流排風暴” 252
5.2.6 CLH自旋鎖 254
5.3 公平鎖與非公平鎖 261
5.3.1 非公平鎖實戰 261
5.3.2 公平鎖實戰 262
5.4 可中斷鎖與不可中斷鎖 263
5.4.1 鎖的可中斷搶佔 263
5.4.2 鎖死的監測與中斷 265
5.5 獨佔鎖與共用鎖 268
5.5.1 獨佔鎖 268
5.5.2 共用鎖Semaphore 268
5.5.3 共用鎖CountDownLatch 271
5.6 讀寫鎖 273
5.6.1 讀寫鎖ReentrantReadWriteLock 273
5.6.2 鎖的升級與降級 275
5.6.3 StampedLock 276

第6章 AQS抽象同步器核心原理 280
6.1 鎖與佇列的關係 280
6.2 AQS的核心成員 282
6.2.1 狀態標誌位元 282
6.2.2 佇列節點類 283
6.2.3 FIFO雙向同步佇列 284
6.2.4 JUC顯式鎖與AQS的關係 285
6.2.5 ReentrantLock與AQS的組合關係 285
6.3 AQS中的範本模式 287
6.3.1 範本模式 288
6.3.2 一個範本模式的參考實現 289
6.3.3 AQS的範本流程 291
6.3.4 AQS中的鉤子方法 291
6.4 通過AQS實現一把簡單的獨佔鎖 292
6.4.1 簡單的獨佔鎖的UML類圖 293
6.4.2 簡單的獨佔鎖的實現 293
6.4.3 SimpleMockLock測試用例 295
6.5 AQS鎖搶佔的原理 296
6.5.1 顯式鎖搶佔的總體流程 296
6.5.2 AQS範本方法:acquire(arg) 297
6.5.3 鉤子實現:tryAcquire(arg) 297
6.5.4 直接入隊:addWaiter 297
6.5.5 自旋入隊:enq 298
6.5.6 自旋搶佔:acquireQueued() 299
6.5.7 掛起預判:shouldParkAfterFailedAcquire 300
6.5.8 執行緒掛起:parkAndCheckInterrupt() 302
6.6 AQS兩個關鍵點:節點的入隊和出隊 302
6.6.1 節點的自旋入隊 303
6.6.2 節點的出隊 303
6.7 AQS鎖釋放的原理 304
6.7.1 SimpleMockLock獨佔鎖的釋放流程 304
6.7.2 AQS範本方法:release() 305
6.7.3 鉤子實現:tryRelease() 305
6.7.4 喚醒後驅:unparkSuccessor() 306
6.8 ReentrantLock的搶鎖流程 306
6.8.1 ReentrantLock非公平鎖的搶佔流程 307
6.8.2 非公平鎖的同步器子類 307
6.8.3 非公平搶佔的鉤子方法:tryAcquire(arg) 308
6.8.4 ReentrantLock公平鎖的搶佔流程 308
6.8.5 公平鎖的同步器子類 309
6.8.6 公平搶佔的鉤子方法:tryAcquire(arg) 309
6.8.7 是否有後驅節點的判斷 310
6.9 AQS條件佇列 310
6.9.1 Condition基本原理 310
6.9.2 await()等待方法原理 312
6.9.3 signal()喚醒方法原理 313
6.9.4 節點入隊的時機 314
6.10 AQS的實際應用 315

第7章 JUC容器類 316
7.1 執行緒安全的同步容器類 316
7.2 JUC高併發容器 318
7.3 CopyOnWriteArrayList 319
7.3.1 CopyOnWriteArrayList的使用 320
7.3.2 CopyOnWriteArrayList原理 321
7.3.3 CopyOnWriteArrayList讀取操作 322
7.3.4 CopyOnWriteArrayList寫入操作 323
7.3.5 CopyOnWriteArrayList的反覆運算器實現 323
7.4 BlockingQueue 324
7.4.1 BlockingQueue的特點 324
7.4.2 阻塞佇列的常用方法 325
7.4.3 常見的BlockingQueue 326
7.4.4 ArrayBlockingQueue的基本使用 328
7.4.5 ArrayBlockingQueue構造器和成員 330
7.4.6 非阻塞式添加元素:add()、offer()方法的原理 332
7.4.7 阻塞式添加元素:put()方法的原理 333
7.4.8 非阻塞式刪除元素:poll()方法的原理 335
7.4.9 阻塞式刪除元素:take()方法的原理 335
7.4.10 peek()直接返回當前佇列的隊首元素 337
7.5 ConcurrentHashMap 337
7.5.1 HashMap和HashTable的問題 337
7.5.2 JDK 1.7版本ConcurrentHashMap的結構 338
7.5.3 JDK 1.7版本ConcurrentHashMap的核心原理 339
7.5.4 JDK 1.8版本ConcurrentHashMap的結構 346
7.5.5 JDK 1.8版本ConcurrentHashMap的核心原理 347
7.5.6 JDK 1.8版本ConcurrentHashMap的核心源碼 350

第8章 高併發設計模式 353
8.1 執行緒安全的單例模式 353
8.1.1 從餓漢式單例到懶漢式單例 353
8.1.2 使用內置鎖保護懶漢式單例 354
8.1.3 雙重檢查鎖方式 355
8.1.4 使用雙重檢查鎖+volatile 356
8.1.5 使用靜態內部類實例懶漢單例模式 357
8.2 Master-Worker模式 357
8.2.1 Master-Worker模式的參考實現 358
8.2.2 Netty中的Master-Worker模式的實現 362
8.2.3 Nginx中的Master-Worker模式的實現 363
8.3 ForkJoin模式 364
8.3.1 ForkJoin模式的原理 364
8.3.2 ForkJoin框架 365
8.3.3 ForkJoin框架使用實戰 366
8.3.4 ForkJoin框架的核心API 367
8.3.5 工作竊取演算法 370
8.3.6 ForkJoin框架的原理 371
8.4 生產者-消費者模式 372
8.5 Future模式 373

第9章 非同步回檔模式 375
9.1 從泡茶的案例說起 375
9.2 join:非同步阻塞之悶葫蘆 376
9.2.1 執行緒的合併流程 376
9.2.2 調用join()實現非同步泡茶喝 376
9.2.3 join()方法詳解 377
9.3 FutureTask:非同步調用之重武器 378
9.3.1 通過FutureTask獲取非同步執行結果的步驟 379
9.3.2 使用FutureTask實現非同步泡茶喝 379
9.4 非同步回檔與非同步阻塞調用 382
9.5 Guava的非同步回檔模式 383
9.5.1 詳解FutureCallback 383
9.5.2 詳解ListenableFuture 384
9.5.3 ListenableFuture非同步任務 384
9.5.4 使用Guava實現泡茶喝的實例 385
9.5.5 Guava非同步回檔和Java非同步調用的區別 388
9.6 Netty的非同步回檔模式 389
9.6.1 GenericFutureListener介面詳解 389
9.6.2 Netty的Future介面詳解 389
9.6.3 ChannelFuture的使用 390
9.6.4 Netty的出站和入站非同步回檔 390
9.7 非同步回檔模式小結 391

第10章 CompletableFuture非同步回檔 392
10.1 CompletableFuture詳解 392
10.1.1 CompletableFuture的UML類關係 392
10.1.2 CompletionStage介面 393
10.1.3 使用runAsync和supplyAsync創建子任務 393
10.1.4 設置的子任務回檔鉤子 394
10.1.5 調用handle()方法統一處理異常和結果 396
10.1.6 執行緒池的使用 397
10.2 非同步任務的串列執行 398
10.2.1 thenApply()方法 398
10.2.2 thenRun()方法 399
10.2.3 thenAccept()方法 399
10.2.4 thenCompose()方法 400
10.2.5 4個任務串列方法的區別 401
10.3 非同步任務的合併執行 402
10.3.1 thenCombine()方法 402
10.3.2 runAfterBoth()方法 404
10.3.3 thenAcceptBoth()方法 404
10.3.4 allOf()等待所有的任務結束 405
10.4 非同步任務的選擇執行 405
10.4.1 applyToEither()方法 406
10.4.2 runAfterEither()方法 407
10.4.3 acceptEither()方法 407
10.5 CompletableFuture的綜合案例 408
10.5.1 使用CompletableFuture實現泡茶喝實例 408
10.5.2 使用CompletableFuture進行多個RPC調用 410
10.5.3 使用RxJava類比RPC非同步回檔 411