第一部分 多綫程編程基礎
第1章 走近Java世界中的綫程 2
1.1 進程、綫程與任務 2
1.2 多綫程編程簡介 4
1.2.1 什麼是多綫程編程 4
1.2.2 為什麼使用多綫程 4
1.3 Java綫程API簡介 5
1.3.1 綫程的創建、啓動與運行 5
1.3.2 Runnable接口 9
1.3.3 綫程屬性 12
1.3.4 Thread類的常用方法 14
1.3.5 Thread類的一些廢棄方法 16
1.4 無處不在的綫程 17
1.5 綫程的層次關係 19
1.6 綫程的生命周期狀態 21
1.7 綫程的監視 22
1.8 多綫程編程簡單運用實例 26
*1.9 多綫程編程的優勢和風險 27
1.10 本章小結 29
第2章 多綫程編程的目標與挑戰 31
2.1 串行、並發與並行 31
2.2 競態 33
2.2.1 二維錶分析法:解釋競態的結果 37
2.2.2 競態的模式與競態産生的條件 39
2.3 綫程安全性 42
2.4 原子性 43
2.5 可見性 49
2.6 有序性 56
2.6.1 重排序的概念 56
2.6.2 指令重排序 57
2.6.3 存儲子係統重排序 63
2.6.4 貌似串行語義 66
2.6.5 保證內存訪問的順序性 68
2.7 上下文切換 69
2.7.1 上下文切換及其産生原因 69
2.7.2 上下文切換的分類及具體誘因 70
2.7.3 上下文切換的開銷和測量 71
2.8 綫程的活性故障 73
2.9 資源爭用與調度 74
2.10 本章小結 77
第3章 Java綫程同步機製 80
3.1 綫程同步機製簡介 80
3.2 鎖概述 81
3.2.1 鎖的作用 82
3.2.2 與鎖相關的幾個概念 84
3.2.3 鎖的開銷及其可能導緻的問題 86
3.3 內部鎖:synchronized關鍵字 86
3.4 顯式鎖:Lock接口 89
3.4.1 顯式鎖的調度 91
3.4.2 顯式鎖與內部鎖的比較 92
3.4.3 內部鎖還是顯式鎖:鎖的選用 95
*3.4.4 改進型鎖:讀寫鎖 95
3.5 鎖的適用場景 99
3.6 綫程同步機製的底層助手:內存屏障 99
*3.7 鎖與重排序 102
3.8 輕量級同步機製:volatile關鍵字 105
3.8.1 volatile的作用 105
3.8.2 volatile變量的開銷 111
3.8.3 volatile的典型應用場景與實戰案例 111
3.9 實踐:正確實現看似簡單的單例模式 120
3.10 CAS與原子變量 126
3.10.1 CAS 127
3.10.2 原子操作工具:原子變量類 129
3.11 對象的發布與逸齣 135
3.11.1 對象的初始化安全:重訪final與static 137
3.11.2 安全發布與逸齣 142
3.12 本章小結 143
第4章 牛刀小試:玩轉綫程 148
4.1 挖掘可並發點 148
4.2 新戰場上的老武器:分而治之 148
4.3 基於數據的分割實現並發化 149
4.4 基於任務的分割實現並發化 158
4.4.1 按任務的資源消耗屬性分割 159
4.4.2 實戰案例的啓發 169
4.4.3 按處理步驟分割 171
4.5 閤理設置綫程數 172
4.5.1 Amdahl's定律 172
4.5.2 綫程數設置的原則 173
4.6 本章小結 177
第5章 綫程間協作 179
5.1 等待與通知:wait/notify 179
5.1.1 wait/notify的作用與用法 180
5.1.2 wait/notify的開銷及問題 188
5.1.3 Object.notify()/notifyAll()的選用 191
*5.1.4 wait/notify與Thread.join() 191
5.2 Java條件變量 192
5.3 倒計時協調器:CountDownLatch 198
5.4 柵欄(CyclicBarrier) 203
5.5 生産者—消費者模式 210
5.5.1 阻塞隊列 213
5.5.2 限購:流量控製與信號量(Semaphore) 216
*5.5.3 管道:綫程間的直接輸齣與輸入 218
5.5.4 一手交錢,一手交貨:雙緩衝與Exchanger 221
5.5.5 一個還是一批:産品的粒度 223
5.5.6 再探綫程與任務之間的關係 224
5.6 對不起,打擾一下:綫程中斷機製 225
5.7 綫程停止:看似簡單,實則不然 228
5.7.1 生産者—消費者模式中的綫程停止 233
5.7.2 實踐:Web應用中的綫程停止 233
5.8 本章小結 236
第6章 保障綫程安全的設計技術 240
*6.1 Java運行時存儲空間 240
6.2 大公無私:無狀態對象 243
6.3 以“不變”應萬變:不可變對象 248
6.4 我有我地盤:綫程特有對象 254
6.4.1 綫程特有對象可能導緻的問題及其規避 258
6.4.2 綫程特有對象的典型應用場景 264
6.5 裝飾器模式 265
6.6 並發集閤 267
6.7 本章小結 270
第7章 綫程的活性故障 273
7.1 鷸蚌相爭:死鎖 273
7.1.1 死鎖的檢測 274
7.1.2 死鎖産生的條件與規避 283
7.1.3 死鎖的恢復 296
7.2 沉睡不醒的睡美人:鎖死 301
7.2.1 信號丟失鎖死 301
7.2.2 嵌套監視器鎖死 301
7.3 巧婦難為無米之炊:綫程飢餓 307
7.4 屢戰屢敗,屢敗屢戰:活鎖 307
7.5 本章小結 308
第8章 綫程管理 310
8.1 綫程組 310
8.2 可靠性:綫程的未捕獲異常與監控 311
8.3 有組織有紀律:綫程工廠 316
8.4 綫程的暫掛與恢復 318
8.5 綫程的高效利用:綫程池 320
8.5.1 任務的處理結果、異常處理與取消 326
8.5.2 綫程池監控 329
8.5.3 綫程池死鎖 330
8.5.4 工作者綫程的異常終止 330
8.6 本章小結 331
第9章 Java異步編程 333
9.1 同步計算與異步計算 333
9.2 Java Executor框架 336
9.2.1 實用工具類Executors 337
9.2.2 異步任務的批量執行:CompletionService 339
9.3 異步計算助手:FutureTask 344
9.3.1 實踐:實現XML文檔的異步解析 345
9.3.2 可重復執行的異步任務 349
9.4 計劃任務 352
9.5 本章小結 358
第10章 Java多綫程程序的調試與測試 360
10.1 多綫程程序的調試技巧 360
10.1.1 使用監視點 360
10.1.2 設置暫掛策略 361
10.2 多綫程程序的測試 363
10.2.1 可測試性 364
10.2.2 靜態檢查工具:FindBugs 369
10.2.3 多綫程程序的代碼復審 370
10.2.4 多綫程程序的單元測試:JCStress 372
10.3 本章小結 375
第二部分 多綫程編程進階
第11章 多綫程編程的硬件基礎與Java內存模型 378
11.1 填補處理器與內存之間的鴻溝:高速緩存 378
11.2 數據世界的交通規則:緩存一緻性協議 382
11.3 硬件緩衝區:寫緩衝器與無效化隊列 386
11.3.1 存儲轉發 388
11.3.2 再探內存重排序 388
11.3.3 再探可見性 391
11.4 基本內存屏障 392
11.5 Java同步機製與內存屏障 395
11.5.1 volatile關鍵字的實現 395
11.5.2 synchronized關鍵字的實現 397
11.5.3 Java虛擬機對內存屏障使用的優化 398
11.5.4 final關鍵字的實現 398
11.6 Java內存模型 399
11.6.1 什麼是Java內存模型 400
11.6.2 happen(s)-before關係 401
11.6.3 再探對象的安全發布 407
11.6.4 JSR 133 411
11.7 共享變量與性能 411
11.8 本章小結 411
第12章 Java多綫程程序的性能調校 415
12.1 Java虛擬機對內部鎖的優化 415
12.1.1 鎖消除 415
12.1.2 鎖粗化 417
12.1.3 偏嚮鎖 419
12.1.4 適應性鎖 420
12.2 優化對鎖的使用 421
12.2.1 鎖的開銷與鎖爭用監視 421
12.2.2 使用可參數化鎖 424
12.2.3 減小臨界區的長度 428
12.2.4 減小鎖的粒度 432
12.2.5 考慮鎖的替代品 438
12.3 減少係統內耗:上下文切換 438
12.4 多綫程編程的“三十六計”:多綫程設計模式 440
12.5 性能的隱形殺手:僞共享 441
12.5.1 Java對象內存布局 442
12.5.2 僞共享的偵測與消除 445
12.6 本章小結 454
Web參考資源 457
參考文獻 463
· · · · · · (
收起)