Java并發(fā)編程實(shí)戰(zhàn)
定 價(jià):69 元
叢書(shū)名:華章專(zhuān)業(yè)開(kāi)發(fā)者叢書(shū)
- 作者:(美) Brian Goetz ... [等] 著
- 出版時(shí)間:2012/2/1
- ISBN:9787111370048
- 出 版 社:機(jī)械工業(yè)出版社
- 中圖法分類(lèi):TP312JA
- 頁(yè)碼:xiv, 293頁(yè)
- 紙張:膠版紙
- 版次:1
- 開(kāi)本:16開(kāi)
《Java并發(fā)編程實(shí)戰(zhàn)》深入淺出地介紹了Java線程和并發(fā),是一本完美的Java并發(fā)參考手冊(cè)。書(shū)中從并發(fā)性和線程安全性的基本概念出發(fā),介紹了如何使用類(lèi)庫(kù)提供的基本并發(fā)構(gòu)建塊,用于避免并發(fā)危險(xiǎn)、構(gòu)造線程安全的類(lèi)及驗(yàn)證線程安全的規(guī)則,如何將小的線程安全類(lèi)組合成更大的線程安全類(lèi),如何利用線程來(lái)提高并發(fā)應(yīng)用程序的吞吐量,如何識(shí)別可并行執(zhí)行的任務(wù),如何提高單線程子系統(tǒng)的響應(yīng)性,如何確保并發(fā)程序執(zhí)行預(yù)期任務(wù),如何提高并發(fā)代碼的性能和可伸縮性等內(nèi)容,最后介紹了一些高級(jí)主題,如顯式鎖、原子變量、非阻塞算法以及如何開(kāi)發(fā)自定義的同步工具類(lèi)。
本書(shū)適合Java程序開(kāi)發(fā)人員閱讀。
第16屆Jolt大獎(jiǎng)提名圖書(shū) JavaOne大會(huì)最暢銷(xiāo)圖書(shū) 了解Java并發(fā)編程必讀佳作
前言
在寫(xiě)作本書(shū)時(shí),對(duì)于中端桌面系統(tǒng)來(lái)說(shuō),多核處理器正變得越來(lái)越便宜。無(wú)獨(dú)有偶,許多開(kāi)發(fā)團(tuán)隊(duì)也注意到,在他們的項(xiàng)目中出現(xiàn)了越來(lái)越多與線程有關(guān)的錯(cuò)誤報(bào)告。在NetBeans開(kāi)發(fā)者網(wǎng)站上的最近一次公告中,一位核心維護(hù)人員注意到,為了修復(fù)與線程相關(guān)的問(wèn)題,在某個(gè)類(lèi)中竟然打了14次補(bǔ)丁。Dion Almaer,這位TheServerSide網(wǎng)站的前編輯,最近(在經(jīng)過(guò)一番痛苦的調(diào)試過(guò)程并最終發(fā)現(xiàn)了一個(gè)與線程有關(guān)的錯(cuò)誤之后)在其博客上寫(xiě)道,在大多數(shù)Java程序中充滿了各種并發(fā)錯(cuò)誤,使得程序只有在“偶然的情況下”才能正常工作。
確實(shí),在開(kāi)發(fā)、測(cè)試以及調(diào)試多線程程序時(shí)存在著巨大的困難,因?yàn)椴l(fā)性錯(cuò)誤通常并不會(huì)以某種確定的方式顯現(xiàn)出來(lái)。當(dāng)這些錯(cuò)誤出現(xiàn)時(shí),通常是在最糟糕的時(shí)刻,例如在正式產(chǎn)品中,或者在高負(fù)載的情況下。
當(dāng)開(kāi)發(fā)Java并發(fā)程序時(shí),所要面對(duì)的挑戰(zhàn)之一就是:平臺(tái)提供的各種并發(fā)功能與開(kāi)發(fā)人員在程序中需要的并發(fā)語(yǔ)義并不匹配。在Java語(yǔ)言中提供了一些底層機(jī)制,例如同步和條件等待,但在使用這些機(jī)制來(lái)實(shí)現(xiàn)應(yīng)用級(jí)的協(xié)議與策略時(shí)必須始終保持一致。如果沒(méi)有這些策略,那么在編寫(xiě)程序時(shí),雖然程序看似能順利地編譯和運(yùn)行,但卻總會(huì)出現(xiàn)各種奇怪的問(wèn)題。許多介紹并發(fā)的其他書(shū)籍更側(cè)重于介紹一些底層機(jī)制和API,而在設(shè)計(jì)級(jí)的策略和模式上敘述的不多。
Java 5.0在Java并發(fā)應(yīng)用程序的開(kāi)發(fā)方面進(jìn)展巨大,它不僅提供了一些新的高層組件,還補(bǔ)充了一些底層機(jī)制,從而使得無(wú)論是新手級(jí)開(kāi)發(fā)人員還是專(zhuān)家級(jí)開(kāi)發(fā)人員都能夠更容易地構(gòu)建并發(fā)應(yīng)用程序。本書(shū)的作者都是JCP專(zhuān)家組的主要成員,也正是該專(zhuān)家組編寫(xiě)了這些新功能。本書(shū)不僅描述了這些新功能的行為和特性,還介紹了它們的底層設(shè)計(jì)模式和促使它們被添加到平臺(tái)庫(kù)中的應(yīng)用場(chǎng)景。
我們的目標(biāo)是向讀者介紹一些設(shè)計(jì)規(guī)則和思維模式,從而使讀者能夠更容易也更樂(lè)意去構(gòu)建正確的以及高性能的Java并發(fā)類(lèi)和應(yīng)用程序。
我們希望你能享受本書(shū)的閱讀過(guò)程。
Brian Goetz
Williston,VT
2006年3月
本書(shū)作者都是Java Community Process JSR 166專(zhuān)家組(并發(fā)工具)的主要成員,并在其他很多JCP專(zhuān)家組里任職。Brian Goetz有20多年的軟件咨詢行業(yè)經(jīng)驗(yàn),并著有至少75篇關(guān)于Java開(kāi)發(fā)的文章。Tim Peierls是“現(xiàn)代多處理器”的典范,他在BoxPop.biz、唱片藝術(shù)和戲劇表演方面也頗有研究。Joseph Bowbeer是一個(gè)Java ME專(zhuān)家,他對(duì)并發(fā)編程的興趣始于Apollo計(jì)算機(jī)時(shí)代。David Holmes是《The Java Programming Language》一書(shū)的合著者,任職于Sun公司。Joshua Bloch是Google公司的首席Java架構(gòu)師,《Effective Java》一書(shū)的作者,并參與著作了《Java Puzzlers》。Doug Lea是《Concurrent Programming》一書(shū)的作者,紐約州立大學(xué) Oswego分校的計(jì)算機(jī)科學(xué)教授。
對(duì)本書(shū)的贊譽(yù)
譯者序
前 言
第1章 簡(jiǎn)介
1.1 并發(fā)簡(jiǎn)史
1.2 線程的優(yōu)勢(shì)
1.2.1 發(fā)揮多處理器的強(qiáng)大能力
1.2.2 建模的簡(jiǎn)單性
1.2.3 異步事件的簡(jiǎn)化處理
1.2.4 響應(yīng)更靈敏的用戶界面
1.3 線程帶來(lái)的風(fēng)險(xiǎn)
1.3.1 安全性問(wèn)題
1.3.2 活躍性問(wèn)題
1.3.3 性能問(wèn)題
1.4 線程無(wú)處不在
第一部分 基礎(chǔ)知識(shí)
第2章 線程安全性
2.1 什么是線程安全性
2.2 原子性
2.2.1 競(jìng)態(tài)條件
2.2.2 示例:延遲初始化中的競(jìng)態(tài)條件
2.2.3 復(fù)合操作
2.3 加鎖機(jī)制
2.3.1 內(nèi)置鎖
2.3.2 重入
2.4 用鎖來(lái)保護(hù)狀態(tài)
2.5 活躍性與性能
第3章 對(duì)象的共享
3.1 可見(jiàn)性
3.1.1 失效數(shù)據(jù)
3.1.2 非原子的64位操作
3.1.3 加鎖與可見(jiàn)性
3.1.4 Volatile變量
3.2 發(fā)布與逸出
3.3 線程封閉
3.3.1 Ad-hoc線程封閉
3.3.2 棧封閉
3.3.3 ThreadLocal類(lèi)
3.4 不變性
3.4.1 Final域
3.4.2 示例:使用Volatile類(lèi)型來(lái)發(fā)布不可變對(duì)象
3.5 安全發(fā)布
3.5.1 不正確的發(fā)布:正確的對(duì)象被破壞
3.5.2 不可變對(duì)象與初始化安全性
3.5.3 安全發(fā)布的常用模式
3.5.4 事實(shí)不可變對(duì)象
3.5.5 可變對(duì)象
3.5.6 安全地共享對(duì)象
第4章 對(duì)象的組合
4.1 設(shè)計(jì)線程安全的類(lèi)
4.1.1 收集同步需求
4.1.2 依賴狀態(tài)的操作
4.1.3 狀態(tài)的所有權(quán)
4.2 實(shí)例封閉
4.2.1 Java監(jiān)視器模式
4.2.2 示例:車(chē)輛追蹤
4.3 線程安全性的委托
4.3.1 示例:基于委托的車(chē)輛追蹤器
4.3.2 獨(dú)立的狀態(tài)變量
4.3.3 當(dāng)委托失效時(shí)
4.3.4 發(fā)布底層的狀態(tài)變量
4.3.5 示例:發(fā)布狀態(tài)的車(chē)輛追蹤器
4.4 在現(xiàn)有的線程安全類(lèi)中添加功能
4.4.1 客戶端加鎖機(jī)制
4.4.2 組合
4.5 將同步策略文檔化
第5章 基礎(chǔ)構(gòu)建模塊
5.1 同步容器類(lèi)
5.1.1 同步容器類(lèi)的問(wèn)題
5.1.2 迭代器與Concurrent-ModificationException
5.1.3 隱藏迭代器
5.2 并發(fā)容器
5.2.1 ConcurrentHashMap
5.2.2 額外的原子Map操作
5.2.3 CopyOnWriteArrayList
5.3 阻塞隊(duì)列和生產(chǎn)者-消費(fèi)者模式
5.3.1 示例:桌面搜索
5.3.2 串行線程封閉
5.3.3 雙端隊(duì)列與工作密取
5.4 阻塞方法與中斷方法
5.5 同步工具類(lèi)
5.5.1 閉鎖
5.5.2 FutureTask
5.5.3 信號(hào)量
5.5.4 柵欄
5.6 構(gòu)建高效且可伸縮的結(jié)果緩存
第二部分 結(jié)構(gòu)化并發(fā)應(yīng)用程序
第6章 任務(wù)執(zhí)行
6.1 在線程中執(zhí)行任務(wù)
6.1.1 串行地執(zhí)行任務(wù)
6.1.2 顯式地為任務(wù)創(chuàng)建線程
6.1.3 無(wú)限制創(chuàng)建線程的不足
6.2 Executor框架
6.2.1 示例:基于Executor的Web服務(wù)器
6.2.2 執(zhí)行策略
6.2.3 線程池
6.2.4 Executor的生命周期
6.2.5 延遲任務(wù)與周期任務(wù)
6.3 找出可利用的并行性
6.3.1 示例:串行的頁(yè)面渲染器
6.3.2 攜帶結(jié)果的任務(wù)Callable與Future
6.3.3 示例:使用Future實(shí)現(xiàn)頁(yè)面渲染器
6.3.4 在異構(gòu)任務(wù)并行化中存在的局限
6.3.5 CompletionService:Executor與BlockingQueue
6.3.6 示例:使用CompletionService實(shí)現(xiàn)頁(yè)面渲染器
6.3.7 為任務(wù)設(shè)置時(shí)限
6.3.8 示例:旅行預(yù)定門(mén)戶網(wǎng)站
第7章 取消與關(guān)閉
第8章 線程池的使用
第9章 圖形用戶界面應(yīng)用程序
第三部分 活躍性、性能與測(cè)試
第10章 避免活躍性危險(xiǎn)
第11章 性能與可伸縮性
第12章 并發(fā)程序的測(cè)試
第四部分 高級(jí)主題
第13章 顯式鎖
第14章 構(gòu)建自定義的同步工具
第15章 原子變量與非阻塞同步機(jī)制
第16章 Java內(nèi)存模型
附錄A 并發(fā)性標(biāo)注
參考文獻(xiàn)
并發(fā)編程是Java語(yǔ)言的重要特性之一,在Java平臺(tái)上提供了許多基本的并發(fā)功能來(lái)輔助開(kāi)發(fā)多線程應(yīng)用程序。然而,這些相對(duì)底層的并發(fā)功能與上層應(yīng)用程序的并發(fā)語(yǔ)義之間并不存在一種簡(jiǎn)單而直觀的映射關(guān)系。因此,如何在Java并發(fā)應(yīng)用程序中正確且高效地使用這些功能就成了Java開(kāi)發(fā)人員的關(guān)注重點(diǎn)。
本書(shū)正是為了解決這個(gè)問(wèn)題而寫(xiě)的。書(shū)中采用循序漸進(jìn)的講解方式,從并發(fā)編程的基本理論入手,逐步介紹了在設(shè)計(jì)Java并發(fā)程序時(shí)各種重要的設(shè)計(jì)原則、設(shè)計(jì)模式以及思維模式,同時(shí)輔以豐富的示例代碼作為對(duì)照和補(bǔ)充,使得開(kāi)發(fā)人員能夠更快地領(lǐng)悟Java并發(fā)編程的要領(lǐng),圍繞著Java平臺(tái)的基礎(chǔ)并發(fā)功能快速地構(gòu)建大規(guī)模的并發(fā)應(yīng)用程序。
全書(shū)內(nèi)容由淺入深,共分為四個(gè)部分。第一部分介紹了Java并發(fā)編程的基礎(chǔ)理論,包括線程安全性與狀態(tài)對(duì)象的基礎(chǔ)知識(shí),如何構(gòu)造線程安全的類(lèi)并將多個(gè)小型的線程安全類(lèi)構(gòu)建成更大型的線程安全類(lèi),以及Java平臺(tái)庫(kù)中的一些基礎(chǔ)并發(fā)模塊;第二部分介紹了并發(fā)應(yīng)用程序的構(gòu)造理論,包括應(yīng)用程序中并行語(yǔ)義的分解及其與邏輯任務(wù)的映射,任務(wù)的取消與關(guān)閉等行為的實(shí)現(xiàn),以及Java線程池中的一些高級(jí)功能,此外還介紹了如何提高GUI應(yīng)用程序的響應(yīng)性;第三部分介紹了并發(fā)編程的性能調(diào)優(yōu),包括如何避免活躍性問(wèn)題,如何提高并發(fā)代碼的性能和可伸縮性以獲得理想的性能,以及在測(cè)試并發(fā)代碼正確性和性能時(shí)的一些實(shí)用技術(shù);第四部分介紹了Java并發(fā)編程中的一些高級(jí)主題,包括顯式鎖、原子變量、非阻塞算法以及如何開(kāi)發(fā)自定義的同步工具類(lèi)等。
本書(shū)的特點(diǎn)在于注重闡述并發(fā)技術(shù)背后的理論知識(shí),對(duì)于每種技術(shù)的介紹不僅使讀者能做到“知其然”,更能做到“知其所以然”。對(duì)于希望深入研究和探索Java并發(fā)編程的讀者來(lái)說(shuō),本書(shū)是非常合適的。
參與本書(shū)翻譯工作的還有李楊、吳漢平、徐光景、童勝漢、陳軍、胡凱、劉紅、張瑋、陳紅、李斌、李勇濤、王海濤、周云波、彭敏才、張世鋒、朱介秋、宗敬、李靜、葉錦、高波、熊莉、程鳳、陳娟、胡世娟、董敏、謝路陽(yáng)、馮卓、李志勇、胡歡、王進(jìn)等。由于譯者的時(shí)間和水平有限,翻譯中的疏漏和錯(cuò)誤在所難免,還望讀者和同行不吝指正。
……