1. 程式人生 > >Java 高併發程式設計詳解:多執行緒與架構設計

Java 高併發程式設計詳解:多執行緒與架構設計

內容簡介

enter image description here

本書主要包含四個部分:

部分主要闡述 Thread 的基礎知識,詳細介紹執行緒的 API 使用、執行緒安全、執行緒間資料通訊,以及如何保護共享資源等內容,它是深入學習多執行緒內容的基礎。

第二部分引入了 ClassLoader,這是因為 ClassLoader 與執行緒不無關係,我們可以通過 synchronized 關鍵字,或者 Lock 等顯式鎖的方式在程式碼的編寫階段對共享資源進行資料一致性保護,那麼一個 Class 在完成初始化的整個過程到後在方法區(JDK8 以後在元資料空間)其資料結構是怎樣確保資料一致性的呢?這就需要對 ClassLoader 有一個比較全面的認識和了解。

第三部分詳細、深入地介紹 volatile 關鍵字的語義,volatile 關鍵字在 Java 中非常重要,可以說它奠定了 Java 核心併發包的高效執行,在這一部分中,我們通過例項展示瞭如何使用 volatile 關鍵字以及非常詳細地介紹了 Java 記憶體模型等知識。

本書的第四部分,站在程式架構設計的角度深入講解了如何設計高效靈活的多執行緒應用程式,這一部分長達15個章節,其重要程度可見一斑。

作者簡介

汪文君,某資料服務中心技術經理、技術專家,目前專注於實時資料 data pipeline 平臺的構建與架構,曾有7年多的移動通訊工作經驗,以及移動網際網路、雲端計算和 B2C 電子商務平臺的開發架構經驗,熱衷於技術分享、技術細節錘鍊。目前已錄製10餘套技術視訊,在網際網路上廣泛傳播。

本書內容

推薦序一

首先恭喜汪文君老師終於出書了,可喜可賀!汪文君老師一直是我敬佩和學習的楷模。十年之前,我在公司認識了新來的長髮少年汪文君同學,至今依然記得文君他對人熱情,對於工作、生活中接觸的各種事物都充滿了好奇心,總是在熱情高漲地學習新技術,他每天晚上都會拿出時間學習,很多節假日也都抽出專門的時間來學習和程式設計。後來聽說汪文君老師在電信、醫療、金融等多個行業從事架構設計、技術指導、程式設計等工作,經驗非常豐富。其間還進行過創業,至今依然對架構設計、程式設計充滿了熱情,持續學習,持續成長,不僅僅自己學習實踐,還錄製了眾多的視訊傳播技術與經驗,根據自己的經歷與心得進一步積累成書,是技術從業者中的佼佼者。

程式設計技術作為 IT 領域的關鍵技術,正在加速影響著越來越多行業的資訊革命。IT 技術不僅僅引發了眾多世界性的產品創新和技術革命,同時也引發了眾多行業的變革,隨著“網際網路+”等的驅動,傳統行業也正在加速技術革命帶來的技術升級與產業升級。IT 技術正在加速改變我們的生活方式、溝通方式、學習方式、思維模式,涉及我們工作、學習、生活的方方面面,技術革新的力量成為了驅動經濟變革與增長的最有效的引擎之一。

Java 技術自1990年由 James Gosling、Mike Sheridan、Sun 首席科學家 Bill Joy 等建立以來,在企業級應用、網際網路應用、移動網際網路應用等開發領域成為獨一無二的霸主級語言,長盛不衰,形成了巨無霸的生態系統;其不僅僅是從業者的工具,也是學習深究的物件,而且一直都在不斷地演進和重生。Java 建立時的宣言“一次編譯、到處執行”(write once,run anywhere)將 Java 帶給了所有的程式設計者。下面就來簡單回顧一下 Java 的重大曆程。

1994年,“Java”之名正式誕生,Java 1.0a 版本開始提供下載。

1996年1月,第一個 JDK——JDK1.0 誕生。

1997年2月18日,JDK1.1 釋出。

1998年12月8日,Java 2 企業平臺 J2EE 釋出。

1999年6月,SUN 公司釋出 Java 的三個版本:標準版(J2SE)、企業版(J2EE)和微型版(J2ME)。

2004年9月30日18:00時,J2SE1.5 釋出,成為 Java 語言發展史上的又一里程碑。為了表示該版本的重要性,J2SE1.5 更名為 Java SE 5.0。

2005年6月,JavaOne 大會召開,Sun 公司公開 Java SE 6。此時,Java 的各種版本已經更名,以取消其中的數字“2”:J2EE 更名為 Java EE,J2SE 更名為 Java SE,J2ME 更名為 Java ME。

2006年12月,Sun 公司釋出 JRE6.0。

2009年4月20日,Oracle 公司以每股9.50美元,74億美元的總額收購 Sun 公司。

2009年12月,Sun 公司釋出 Java EE 6。

2011年7月28日,Oracle 公司釋出 J2SE 7.0。

2014年3月18日,Oracle 公司釋出 Java 8 發行版(OTN)。

2017年9月21日,Oracle 公司正式釋出 Java 9。

本書圍繞 Java 程式設計中多執行緒程式設計的基礎與應用設計分為四個部分來展開講解,包括多執行緒技術知識、Java ClassLoader、深入理解 volatile 關鍵字、多執行緒設計架構模式。Java 程式語言是工業級的程式語言,在諸多應用、諸多場景下被廣泛使用,多執行緒技術作為 Java 語言和應用的基礎能力,對其的學習、理解和掌握,不僅僅能夠提升我們的技能,更能作為我們更好地理解面向物件程式設計、併發程式設計、高效能程式設計、分散式程式設計的入口,進一步還會涉及作業系統執行緒模型、JVM 執行緒模型、應用場景優化。通過學習本書,我們能夠更全面地拓展自己的程式設計能力,更進一步地充實程式設計設計和架構設計的系統性思維。

為了更好地運用 Java 程式設計,讓我們從掌握多執行緒技術的知識點開始出發!

東軟集團移動網際網路事業部首席技術官 徐景輝

推薦序二

 汪文君是我們軟體開發團隊裡特別有朝氣的一員,平時不管是工作還是業餘時間,其都會對軟體開發遇到的難題、專題進行不折不撓的攻關研究,他是團隊所有人心目中的技術大牛。我作為部門主管,從三個月前得知他開始寫這本書時,就特別期待,之前他利用業餘時間錄製網上視訊供大家學習與交流,現在他把這些知識再加以整理出版成書,相信他的所作所為能讓許多人受益。

Java 應該是目前使用者最多、應用場景最廣的軟體開發技術之一,這與 Java 技術本身的一個重要優點緊密相關。Java 通過虛擬機器技術隱藏了底層的複雜性以及機器和作業系統的差異性,使得程式設計師無須過多地關注底層技術,而是把精力集中在如何實現業務邏輯之上。在許多情況下,一般程式設計師只要瞭解了必要的 Java API 和語法,就已經能夠滿足日常開發的需要了。

然而,在企業級的軟體開發場景裡,要求遠遠不止如此簡單。比方說,我們所在的金融領域,日常維護著上千個節點 PB 資料量級別的物理叢集,對程式的併發性、穩定性和安全性都有極高的要求。在這樣的情況下,高效能的物理硬體固然是基礎,然而如果開發人員不瞭解與 Java 高併發相關的技術原理,就無法寫出最優化的程式碼。

市面上 Java 相關的書籍,大多比較適合初學者,只涵蓋基礎內容,並不多見那種深入某個高階主題並富有思想性的專題書籍。雖然本書對讀者的 Java 基礎有一定的要求,但本書勝在內容豐富,講解深入淺出,相信對於這個專題有興趣的讀者一定不會感到乏味和艱澀。作者在今日頭條釋出的《心藍說 Java》視訊,也一定能讓讀者更容易深入瞭解這個課題。

Head of Data Engineering at HSBC Winne Chen

推薦序三

我與汪文君共事過幾年,我們負責的是全球性交易系統,對系統性能的要求極高,例如在高併發情況下,如何快速響應使用者請求的同時又要保證資料的完整性,這就要求團隊的技術人員需要有極高的專業素養。汪文君是團隊裡的技術骨幹,在我們共事的日子裡,汪文君解決了很多技術難題,更難能可貴的是,汪文君在設計階段就敏捷地洞察到系統可能會出現的瓶頸並且提供解決方案,而且他還將每一個點子、每一個難題的解決之道激情地分享給團隊的所有成員。

汪文君告訴我他要出版一本 Java 多執行緒方面的書,並且給我發來了一些章節,我閱讀後覺得非常棒。這是一個邏輯性很強的技術牛人在有邏輯、有層次地展開 Java 多執行緒的話題,他能將每一個 Java 多執行緒相關的話題都講解得很有深度。在整本書的構想方面,各個章節的內聚性都很強,章節與章節之間又是層層推進的關係,再加以精準的圖示輔助理解,讓讀者閱讀起來感覺非常舒服。

看汪文君的書,就如同聽一個久經沙場的戰士講解如何玩轉槍械,本書中所講解的都是一個個的實戰運用,對提升 Java 內功必然大有裨益。

Development manager at HSBC Global Banking and Markets Bonson Zheng

推薦序四

Alex has spent years passionately promoting,mentoring and collaborating with the technology community.Whether this has been answering questions or creating tutorials for new and exciting technologies he always brings his keen intellect to bear and makes complex subjects both easy to understand and enjoyable to learn.In this book Alex distills all these years of passion and knowledge into a comprehensive book that covers everything you need to know about Java taking you from the basics all the way through to the most complex parts of the language.The result is a book that everyone working with Java should add to their bookshelf and will be a future classic text.(Alex 花了很多年的時間積極熱情地推動著技術社群的發展,併為其做出貢獻,無論是回答初學者的問題還是為最新的技術編著入門教程,他總是帶著敏銳和智慧試圖讓一切複雜晦澀的技術內容變得通俗易懂,系統又有條理。在 Alex 的這本書中,他將這些年付諸的激情與知識提煉成冊,涵蓋了你所需要了解的有關 Java 多執行緒的大部分知識,從基礎知識到最複雜的內容,他都做到了通俗易懂地娓娓道來,每一位從事 Java 開發的從業者都應該將這本書新增到他們的書架上,這本書將成為比較經典的文字資料。)

Chief Technology Officer at Octagon Strategy Ltd Andrew Davidson

前言

為什麼寫這本書

從大學畢業到現在已有11年的時間,在這11年中,我一直保持著一個習慣,將工作中用到的技術梳理成系統性的文件。在專案的開發過程中,由於時間的緊迫性,我們對某個技術領域知識的掌握往往都是比較碎片化的,系統化地串聯知識碎片,不僅能加深對該技術的掌握,還能方便日後快速查閱,幫助記憶。截至目前,我已經在網際網路上釋出了大約12本電子書,主要是圍繞著專案構建工具、Java 開發的相關技術、NoSQL、J2EE 等內容展開的。

2017年年初,很多人看過我寫的《Java 8 之 Stream》電子書之後,給我發郵件,希望我寫一本能夠涵蓋 Java 8 所有新特性的電子書。最開始一兩個人這樣提議的時候,我並沒有在意,後來越來越多的朋友都有類似的需求,由於寫電子書需要花費很長的時間,於是我嘗試著將 Java 8 新特性錄製成視訊教程,大概花了一個月的業餘時間我錄製了40集《汪文君 Java8 實戰視訊》,視訊一經推出收穫了非常多的好評,所幸大家都比較喜歡我的授課風格,在過去的2017年,我一口氣錄製了11套視訊教程,超過400集(每集都在30分鐘左右),當然也包括 Java 高併發相關的內容。

在我的計劃中,關於 Java 高併發的內容將會發布4套視訊教程,分別是:第一階段(Java 多執行緒基礎),第二階段(Java 記憶體模型,高併發設計模式),第三階段(Java 併發包 JUC),第四階段(Java 併發包原始碼剖析 AQS)。其中三個階段都已經發布了,在今日頭條《心藍說 Java》中累計播放時長超過20萬分鍾,百度雲盤下載量也超過了30萬餘次。由於內容太多,本書只涵蓋了前兩個階段的內容,經過了數以萬計讀者對視訊教程問題的指正,本書的寫作相對比較順利,本書內容不僅修復了視訊講解中無法修復的缺陷,而且還加入了我對 Java 高併發更深一層的領悟和體會。

本書是我第一本正式出版的書稿,關於本書的寫作可以說是一次偶然的機緣巧合,在2017年9月初,機械工業出版社的策劃編輯 Lisa 找到了我,她覺得我的視訊內容比較系統,非常適合以書稿的形式發表,我們簡單交流之後就快速敲定了本書內容的主體結構,圍繞著高併發視訊教程的前兩個階段展開,在今年我也會努力將高併發後兩個階段的內容編著成書,使之儘快與讀者見面。

讀者物件

  • 計算機相關專業的在校學生。

  • 從事 Java 語言的開發者。

  • 從事 Java 系統架構的架構師。

  • 使用 Java 作為開發語言的公司與集體。

  • 開設 Java 課程的專業院校。

  • 開設 Java 課程的培訓機構。

如何閱讀本書

本書主要分為四部分,其中,第一部分主要闡述 Thread 的基礎知識,詳細介紹執行緒的 API 使用、執行緒安全、執行緒間資料通訊以及如何保護共享資源等內容,它是深入學習多執行緒內容的基礎。

在第二部分中之所以引入 ClassLoader,是因為 ClassLoader 與執行緒不無關係,我們可以通過 synchronized 關鍵字,或者 Lock 等顯式鎖的方式在程式碼的編寫階段對共享資源進行資料一致性保護,那麼一個 Class 在完成初始化的整個過程到最後在方法區(JDK8 以後在元資料空間)其資料結構是怎樣確保資料一致性的呢?這就需要對 ClassLoader 有一個比較全面的認識和了解。

在本書的第三部分中,我用了三章的篇幅來詳細、深入地介紹 volatile 關鍵字的語義,volatile 關鍵字在 Java 中非常重要,可以說它奠定了 Java 核心併發包的高效執行,在這一部分中,我們通過例項展示瞭如何使用 volatile 關鍵字並非常詳細地介紹了 Java 記憶體模型等知識。

本書的最後一部分也就是第四部分,站在程式架構設計的角度講解如何設計高效靈活的多執行緒應用程式,第四部分應該是內容最多的一部分,總共包含了15章。

勘誤和支援

由於作者的水平有限,編寫的時間也很倉促,書中難免會出現一些錯誤或者不準確的地方,懇請讀者批評指正。如果在閱讀的過程中發現任何問題都歡迎將您寶貴的意見傳送到我的個人郵箱[email protected],我會專門在我的今日頭條《心藍說 Java》開設專欄,用於修訂書中出現的錯誤和不妥的地方,我真摯地期待著您的建議和反饋。

致謝

首先要感謝我的父親,在我很小的時候,他就教育我做任何事情都要腳踏實地,一步一個腳印,做人不能浮躁,任何事情都不是一蹴而就的,這也致使我在遇到發展瓶頸的時候總能夠耐得住性子尋求突破。

在本書最後一部分編寫的過程中,我的妻子經歷了十月懷胎為我生下了一對龍鳳胎汪子敬、汪子兮兄妹,他倆的到來讓我感覺到了初為人父的激動與喜悅,更加體會到了為人父母的不容易,感謝我的妻子,多謝你的支援和理解,本書的出版應該有一半你的功勞。

我還要感謝在我一路成長過程中帶給我很多幫助的同事及朋友——徐景輝、Andrew Davidson、Bonson、Winne、Wilson、龍含等,在本書還是草稿階段的時候,你們就給了我很多建設性的意見和建議。

當然也不能忘了感謝本書的策劃編輯 Lisa 老師,是你直接促成了本書的誕生,在過去的半年多裡,你反覆不斷地幫我審稿,修改錯別字,調整不通順的語句,你的專業水準和敬業精神幫助我最終順利完稿。

最後一定要感謝我所在的研發團隊——GBDS 的 Jack、Eachur、Jenny、Sebastian、Yuki、Kiki、Dillon、Gavin、Wendy、Josson、Echo、Ivy、Lik、Leo、Allen、Adrian、Kevin、Ken、Terrence,以及 VADM 的 Jeffrey、Robert、Amy、Randy 等,多謝你們在工作中對我的幫助。

謹以此書,獻給我最親愛的家人,以及眾多熱愛 Java 開發的朋友們。

汪文君(Alex Wang)

中國,廣州,2018年3月

第一部分 多執行緒基礎

第一部分的內容是整本書的基礎,其圍繞著 Thread API 及 ThreadGroup API 等進行講解,在編寫第一部分內容的過程中,筆者大量參考了虛擬機器規範以及 JDK 官方文件,並深入原始碼分析每一個方法的詳細資訊。

第1章“快速認識執行緒”:本章主要介紹執行緒的概念,以及執行緒在 Java 中的主要作用,並且詳細講解了執行緒的生命週期,以及生命週期每個狀態之間的切換方法。

第2章“深入理解 Thread 建構函式”:本章主要介紹了所有與 Thread 有關的建構函式,執行緒的父子關係(並非繼承關係,而是一種包含關係),Thread 和 ThreadGroup 之間的關係,Thread 與虛擬機器棧的關係(學習這部分內容需要讀者有 JVM 的相關基礎,尤其是對棧記憶體要有深入的理解),最後還介紹了守護執行緒的概念、特點和使用場景。

第3章“Thread API 的詳細介紹”:本章深入分析了 Thread 的所有 API,熟練掌握 Thread 的 API 是學好 Thread 的前提。

第4章“執行緒安全與資料同步”:本章首先從一個簡單的例子入手,講解了資料同步的概念,以及會引發資料不一致性問題的情況,然後非常詳細地介紹了 synchronized 關鍵字以及與其對應的 JVM 指令。本章的最後還分析了幾種可能引起程式進入死鎖的原因,以及如何使用工具進行診斷,執行緒安全與資料同步是執行緒中最重要也是最複雜的知識點之一,掌握好本章的內容可以使得程式在多執行緒的情況下既高效又安全的執行。

第5章“執行緒間通訊”:我們在開發多執行緒程式的時候,往往不會只存在一個獨立的執行緒,相反大多數情況下是需要多個執行緒之間進行協同工作的,如何在多個執行緒之間進行通訊,是本章學習的重點。另外,本章的最後部分將會分析 synchronized 關鍵字的缺陷,我們手動實現了一個顯式鎖(BooleanLock)可以解決 synchronized 所不具備的功能,其中也需要用到執行緒間通訊的知識。

第6章“ThreadGroup 詳細講解”:如果在建立執行緒時並未指定所屬的 Group,執行緒會預設和父執行緒加入同一個 Group 之中,ThreadGroup 為執行緒提供了一定的結構組織能力。通過本章的學習,讀者將會深入掌握 ThreadGroup 所有 API 的使用以及 Thread 和 ThreadGroup 之間的關係。

第7章“Hook 執行緒以及捕獲執行緒執行異常”:不管是 Runnable 介面的 run 方法還是 Thread 本身的 run 方法,都是不允許丟擲 checked 異常的,這樣啟動執行緒就會無法捕獲到異常資訊,JDK 為我們提供了 UncaughtExceptionHandler 介面。本章將通過對 UncaughtExceptionHandler 的原始碼進行分析,使讀者能夠清晰地瞭解當 Thread 執行任務時出現異常應如何進行 Handler 的回撥。本章的最後,我們還將學習如何向一個 JVM 程序注入 Hook 執行緒,當 JVM 程序收到中斷訊號時 Hook 執行緒將被觸發執行。

第8章“執行緒池原理以及自定義執行緒池”:本章首先從執行緒池的原理入手,詳細講解了一個功能完善的執行緒池應該具備哪些要素,其中包括任務佇列、執行緒數量管理、拒絕策略、執行緒工廠等,後文中也會經常使用我們建立的執行緒池。

第1章 快速認識執行緒
第2章 深入理解 Thread 建構函式
第3章 Thread API 的詳細介紹
第4章 執行緒安全與資料同步
第5章 執行緒間通訊
第6章 ThreadGroup 詳細講解
第7章 Hook 執行緒以及捕獲執行緒執行異常
第8章 執行緒池原理以及自定義執行緒池
第二部分 Java ClassLoader
第9章 類的載入過程
第10章 JVM 類載入器
第11章 執行緒上下文類載入器
第三部分 深入理解 volatile 關鍵字
第12章 volatile 關鍵字的介紹
第13章 深入 volatile 關鍵字
第14章 7種單例設計模式的設計
第四部分 多執行緒設計架構模式
第15章 監控任務的生命週期
第16章 Single Thread Execution 設計模式
第17章 讀寫鎖分離設計模式
第18章 不可變物件設計模式
第19章 Future 設計模式
第20章 Guarded Suspension 設計模式
第21章 執行緒上下文設計模式
第22章 Balking 設計模式
第23章 Latch 設計模式
第24章 Thread-Per-Message 設計模式
第25章 Two Phase Termination 設計模式
第26章 Worker-Thread 設計模式
第27章 Active Objects 設計模式
第28章 Event Bus 設計模式
第29章 Event Driven 設計模式

閱讀全文: http://gitbook.cn/gitchat/geekbook/5c04a6f9b4075a37edf1374f