內容簡介
《Java並發編程實戰》是一本完美的Java並發參考手冊。書中從並發性和執行緒安全性的基本概念出發,介紹了如何使用類庫提供的基本並發構建塊,用於避免並發危險、構造執行緒安全的類及驗證執行緒安全的規則,如何將小的執行緒安全類組合成更大的執行緒安全類,如何利用執行緒來提高並發應用程式的吞吐量,如何識別可並行執行的任務,如何提高單執行緒子系統的回響性,如何確保並發程式執行預期任務,如何提高並發代碼的性能和可伸縮性等內容,最後介紹了一些高級主題,如顯式鎖、原子變數、非阻塞算法以及如何開發自定義的同步工具類。
編輯推薦
第16屆Jolt大獎提名圖書
JavaOne大會最暢銷圖書
了解Java並發編程必讀佳作
作者簡介
本書作者都是Java Community Process JSR 166專家組(並發工具)的主要成員,並在其他很多JCP專家組裡任職。 Brian Goetz有20多年的軟體諮詢行業經驗,並著有至少75篇關於Java開發的文章。Tim Peierls是“現代多處理器”的典範,他在BoxPop-biz、唱片藝術和戲劇表演方面也頗有研究。Joseph Bowbeer是一個Java ME專家,他對並發編程的興趣始於Apollo計算機時代。 David Holmes是《The Java Programming Language》一書的合著者,任職於Sun公司。 Joshua Bloch是Google公司的首席Java架構師,《Effective Java》一書的作者,並參與著作了《Java Puzzlers》。 Doug Lea是《Concurrent Programming》一書的作者,紐約州立大學 Oswego分校的計算機科學教授。
媒體評論
“我曾有幸在一個偉大的團隊中工作,參與設計和實現在Java 5.0和Java 6等平台中新增的並發功能。現在,仍然是這個團隊,將透徹地講解這些新功能,以及關於並發的一般性概念。並發已不再只是高級用戶談論的話題,每一位Java開發人員都應該閱讀這本書。”
——Martin Buchholz,Sun公司的JDK並發大師
“在過去30多年時間裡,計算機性能一直遵循著摩爾定律,但從現在開始,它將遵循Amdahl定律。編寫能高效利用多處理器的代碼非常具有挑戰性。 在這本書中介紹的一些概念和技術,對於在當前(以及未來的)系統上編寫安全的和可伸縮的代碼來說都是非常有用的。”
——Doron Rajwan,Intel公司研究人員
“如果你正在編寫、設計、調試、維護以及分析多執行緒的Java程式,那么本書正是你所需要的。如果你曾對某個方法進行過同步,但卻不理解其中的原因,那么你以及你的用戶都有必要從頭至尾仔細地讀一讀這本書。”
——Ted Neward,《Effective Enterprise Java》的作者
“Brian非常清晰地闡述了並發的一些基本問題與複雜性。對於使用執行緒並關注程式執行性能的開發人員來說,這是一本必讀的書。”
——Kirk Pepperdine,JavaPerformanceTuning-com網站CTO
“本書深入淺出地介紹了一些複雜的編程主題,是一本完美的Java並發參考手冊。書中的每一頁都包含了程式設計師日常需要應對的問題(以及相應的解決方案)。隨著摩爾定律的發展趨勢由提高處理器核的速度轉向增加處理器核的數量,如何有效地利用並發性已變得越來越重要,本書正好介紹了這些方面的內容。”
——Cliff Click博士,Azul Systems公司高級軟體工程師
“我對並發有著濃厚的興趣,並且與大多數程式設計師相比,我或許寫過更多存線上程死鎖的代碼,也在同步上犯了更多的錯誤。在介紹Java執行緒和並發等主題的眾多書籍中,Brian的這本書最具可讀性,它通過循序漸進的方式將一些複雜的主題闡述得很清楚。我將本書推薦給Java Specialists Newsletter的所有讀者,因為它不僅有趣,而且很有用,它介紹了當前Java開發人員正在面對的許多問題。”
——Heinz Kabutz博士,Java Specialists Newsletter的維護者
“我一直努力想使一些簡單的問題變得更簡單,然而本書已經簡化了一個複雜但卻關鍵的主題:並發。這本書採用了創新的講解方法、簡單明了的風格,它注定會成為一本非常重要的書。
——Bruce Tate,《Beyond Java》的作者
這本書為Java開發人員線上程編程領域提供了不可多得的知識。我在讀這本書時受到了極大的啟發,部分原因在於它詳細地介紹了Java中並發領域的API,但更重要的卻在於這本書以一種透徹並且易懂的方式來介紹複雜的並發知識,這是其他書籍很難媲美的。
——Bill Venners,《Inside the Java Virtual Machine》的作者
作品目錄
對本書的讚譽
譯者序
前 言
第1章 簡介
1.1 並發簡史
1.2 執行緒的優勢
1.2.1 發揮多處理器的強大能力
1.2.2 建模的簡單性
1.2.3 異步事件的簡化處理
1.2.4 回響更靈敏的用戶界面
1.3 執行緒帶來的風險
1.3.1 安全性問題
1.3.2 活躍性問題
1.3.3 性能問題
1.4 執行緒無處不在
第一部分 基礎知識
第2章 執行緒安全性
2.1 什麼是執行緒安全性
2.2 原子性
2.2.1 競態條件
2.2.2 示例:延遲初始化中的競態條件
2.2.3 複合操作
2.3 加鎖機制
2.3.1 內置鎖
2.3.2 重入
2.4 用鎖來保護狀態
2.5 活躍性與性能
第3章 對象的共享
3.1 可見性
3.1.1 失效數據
3.1.2 非原子的64位操作
3.1.3 加鎖與可見性
3.1.4 Volatile變數
3.2 發布與逸出
3.3 執行緒封閉
3.3.1 Ad-hoc執行緒封閉
3.3.2 棧封閉
3.3.3 ThreadLocal類
3.4 不變性
3.4.1 Final域
3.4.2 示例:使用Volatile類型來發布不可變對象
3.5 安全發布
3.5.1 不正確的發布:正確的對象被破壞
3.5.2 不可變對象與初始化安全性
3.5.3 安全發布的常用模式
3.5.4 事實不可變對象
3.5.5 可變對象
3.5.6 安全地共享對象
第4章 對象的組合
4.1 設計執行緒安全的類
4.1.1 收集同步需求
4.1.2 依賴狀態的操作
4.1.3 狀態的所有權
4.2 實例封閉
4.2.1 Java監視器模式
4.2.2 示例:車輛追蹤
4.3 執行緒安全性的委託
4.3.1 示例:基於委託的車輛追蹤器
4.3.2 獨立的狀態變數
4.3.3 當委託失效時
4.3.4 發布底層的狀態變數
4.3.5 示例:發布狀態的車輛追蹤器
4.4 在現有的執行緒安全類中添加功能
4.4.1 客戶端加鎖機制
4.4.2 組合
4.5 將同步策略文檔化
第5章 基礎構建模組
5.1 同步容器類
5.1.1 同步容器類的問題
5.1.2 疊代器與Concurrent-ModificationException
5.1.3 隱藏疊代器
5.2 並發容器
5.2.1 ConcurrentHashMap
5.2.2 額外的原子Map操作
5.2.3 CopyOnWriteArrayList
5.3 阻塞佇列和生產者-消費者模式
5.3.1 示例:桌面搜尋
5.3.2 串列執行緒封閉
5.3.3 雙端佇列與工作密取
5.4 阻塞方法與中斷方法
5.5 同步工具類
5.5.1 閉鎖
5.5.2 FutureTask
5.5.3 信號量
5.5.4 柵欄
5.6 構建高效且可伸縮的結果快取
第二部分 結構化並發應用程式
第6章 任務執行
6.1 線上程中執行任務
6.1.1 串列地執行任務
6.1.2 顯式地為任務創建執行緒
6.1.3 無限制創建執行緒的不足
6.2 Executor框架
6.2.1 示例:基於Executor的Web伺服器
6.2.2 執行策略
6.2.3 執行緒池
6.2.4 Executor的生命周期
6.2.5 延遲任務與周期任務
6.3 找出可利用的並行性
6.3.1 示例:串列的頁面渲染器
6.3.2 攜帶結果的任務Callable與Future
6.3.3 示例:使用Future實現頁面渲染器
6.3.4 在異構任務並行化中存在的局限
6.3.5 CompletionService:Executor與BlockingQueue
6.3.6 示例:使用CompletionService實現頁面渲染器
6.3.7 為任務設定時限
6.3.8 示例:旅行預定入口網站
第7章 取消與關閉
第8章 執行緒池的使用
第9章 圖形用戶界面應用程式
第三部分 活躍性、性能與測試
第10章 避免活躍性危險
第11章 性能與可伸縮性
第12章 並發程式的測試
第四部分 高級主題
第13章 顯式鎖
第14章 構建自定義的同步工具
第15章 原子變數與非阻塞同步機制
第16章 Java記憶體模型
附錄A 並發性標註
參考文獻