1. 程式人生 > >【新聞】本人新書《Java多執行緒程式設計實戰指南(核心篇)》已出版上市

【新聞】本人新書《Java多執行緒程式設計實戰指南(核心篇)》已出版上市

豆瓣主頁

購買連結

試讀下載

(待補充)

原始碼下載

內容簡介

隨著現代處理器的生產工藝從提升處理器主頻頻率轉向多核化,即在一塊晶片上整合多個處理器核心(Core),多核處理器(Multicore Processor)離我們越來越近了——如今就連智慧手機這樣的消費類裝置都已配備了4核乃至8核的處理器,更何況商用系統!在此背景下,以往靠單個處理器自身處理能力的提升所帶來的軟體計算效能提升的那種“免費午餐”已不復存在,這使得多執行緒程式設計在充分利用計算資源、提高軟體服務質量方面扮演了越來越重要的角色。故而,掌握多執行緒程式設計技能對廣大開發人員的重要性亦由此可見一斑。《Java多執行緒程式設計實戰指南(核心篇)》以基本概念、原理與方法為主線,輔以豐富的實戰案例和生活化例項,並從Java虛擬機器、作業系統和硬體多個層次與角度出發,循序漸進、系統地介紹Java平臺下的多執行緒程式設計核心技術及相關工具。

《Java多執行緒程式設計實戰指南(核心篇)》適合有一定Java語言基礎的讀者作為入門多執行緒程式設計之用,也適合有一定多執行緒程式設計經驗的讀者作為重新梳理知識結構以提升認知層次和參考之用。

目錄

第一部分 多執行緒程式設計基礎

第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