1. 程式人生 > >併發程式設計網 – ifeve.com

併發程式設計網 – ifeve.com

一、內容簡介

併發程式設計相比 Java 中其他知識點的學習門檻較高,從而導致很多人望而卻步。但無論是職場面試,還是高併發/ 高流量系統的實現,卻都離不開併發程式設計,於是能夠真正掌握併發程式設計的人成為了市場迫切需求的人才。

《Java併發程式設計之美》通過圖文結合、通俗易懂的講解方式幫助大家完成多執行緒併發程式設計從入門到實踐的飛躍!《Java併發程式設計之美》分為三部分,第一部分為Java 併發程式設計基礎篇,主要講解Java 併發程式設計的基礎知識、執行緒有關的知識和併發程式設計中的其他相關概念,這些知識在高階篇都會有所使用,掌握了本篇的內容,就為學習高階篇奠定了基礎;第二部分為Java 併發程式設計高階篇,講解了Java 併發包中核心元件的實現原理,讓讀者知其然,也知其所以然,熟練掌握本篇內容,對我們在日常開發高併發、高流量的系統時會大有裨益;第三部分為Java 併發程式設計實踐篇,主要講解併發元件的使用方法,以及在使用過程中容易遇到的問題和解決方法。

《Java併發程式設計之美》適合Java 初級、中高階研發工程師,對Java 併發程式設計感興趣,以及希望探究JUC 包原始碼原理的人員閱讀。

二、精彩書評

Java的併發程式設計太重要,又太迷人,所以自Goetz的Java Concurrency in Practice在2006年出版,2012年重譯以來,國內的眾多作者又陸陸續續出版了若干本相關主題的書籍。那我手上的這本,是又一本Java併發程式設計(Yet Another )嗎?為了找一個大家再次購買的理由,我快速翻完了全書。

顯而易見,作者是一位喜歡用程式碼說話的同學,第1部分基礎知識中的每個知識點都伴隨一段簡短的示例及證明的程式碼,程式碼不撒謊。

作者對程式碼的愛,也帶到了第二部分。書中針對Java併發庫中的主要元件,進行了程式碼級的原理講解,而且緊貼時代脈搏,涵蓋了JDK 8的內容。如果你能耐下心來,跟隨作者進行一番程式碼級的探究,所產生的印象比閱讀文章、死記結論,無疑要深刻得多。

到了最後的實踐部分,依然沒有模式、架構之類的巨集大敘事,而是作者自己一個個的實踐例子。

所以,如果要簡單概括,這就是一本有好奇心的Coder,寫給另一位有好奇心的Coder的Java併發程式設計書。

——肖樺(江南白衣),唯品會資深架構師,公眾號“春天的旁邊”

JDK 1.5之前,我們必須自己編寫程式碼實現一些併發程式設計的邏輯;之後到了JDK 1.5,Doug Lea解救了廣大Java使用者,在JDK裡特意設計並實現了一套JUC的框架,給大家提供了非常好的併發程式設計體驗。本書作者在阿里經歷過大量併發的場景,積攢了不少併發程式設計的經驗,並毫無保留地寫入本書。通過書中對JUC原始碼的解讀,讀者可以揭開JUC的神祕面紗。這是一本值得仔細品讀的好書。

——你假笨/寒泉子,PerfMa CEO,公眾號“你假笨”

Java 併發程式設計所涉及的知識點比較多,多執行緒程式設計所考慮的場景相對比較複雜,包括執行緒間的資源共享、競爭、死鎖等問題。併發程式設計相比 Java 中其他知識點,學習起來門檻相對較高,學習難度較大,從而導致很多人望而卻步。加多的《Java併發程式設計之美》這本書剛好填補了這個空缺,作者在併發程式設計領域深耕多年。本書用淺顯易懂的文字為大家系統地介紹了 Java 併發程式設計的相關內容,推薦大家關注學習。

——純潔的微笑,第三方支付公司技術總監,公眾號“純潔的微笑”

Java併發程式設計無處不在,Java多執行緒、併發處理是深入學習Java必須要掌握的技術。本書涵蓋了Java併發包中的核心類、API以及框架等內容,並輔以詳盡的案例講解,幫助讀者快速學習、迅速掌握。如果你希望成長為一名優秀的Java程式設計師,有必要讀一讀本書。

——許令波,《深入分析Java Web技術內幕》作者

第1作者加多是一位非常勤奮的技術人員,經常釋出各種技術文章,有時候甚至能做到每天一篇,在併發程式設計網已經累計釋出了近百篇文章。本書是他多年的積累,厚積薄發,從併發程式設計的基礎知識一直到實戰娓娓道來,希望讀者喜歡。

——方騰飛,併發程式設計網創始人

三、 目錄

第一部分 Java 併發程式設計基礎篇

第1 章 併發程式設計執行緒基礎 2

1.1 什麼是執行緒 2

1.2 執行緒建立與執行 3

1.3 執行緒通知與等待 6

1.4 等待執行緒執行終止的join 方法 16

1.5 讓執行緒睡眠的sleep 方法 19

1.6 讓出CPU 執行權的yield 方法 23

1.7 執行緒中斷 24

1.8 理解執行緒上下文切換 30

1.9 執行緒死鎖 30

1.9.1 什麼是執行緒死鎖 30

1.9.2 如何避免執行緒死鎖 33

1.10 守護執行緒與使用者執行緒 35

1.11 ThreadLocal 39

1.11.1 ThreadLocal 使用示例 40

1.11.2 ThreadLocal 的實現原理 42

1.11.3 ThreadLocal 不支援繼承性 45

1.11.4 InheritableThreadLocal 類 46

第2 章 併發程式設計的其他基礎知識 50

2.1 什麼是多執行緒併發程式設計 50

2.2 為什麼要進行多執行緒併發程式設計 51

2.3 Java 中的執行緒安全問題 51

?2.4 Java 中共享變數的記憶體可見性問題 52

2.5 Java 中的synchronized 關鍵字 54

2.5.1 synchronized 關鍵字介紹 54

2.5.2 synchronized 的記憶體語義 55

2.6 Java 中的volatile 關鍵字 55

2.7 Java 中的原子性操作 57

2.8 Java 中的CAS 操作 59

2.9 Unsafe 類 59

2.9.1 Unsafe 類中的重要方法 59

2.9.2 如何使用Unsafe 類 61

2.10 Java 指令重排序 65

2.11 偽共享 67

2.11.1 什麼是偽共享 67

2.11.2 為何會出現偽共享 68

2.11.3 如何避免偽共享 70

2.11.4 小結 72

2.12 鎖的概述 72

2.12.1 樂觀鎖與悲觀鎖 72

2.12.2 公平鎖與非公平鎖 75

2.12.3 獨佔鎖與共享鎖 75

2.12.4 什麼是可重入鎖 76

2.12.5 自旋鎖 77

2.13 總結 77

第二部分 Java 併發程式設計高階篇

第3 章 Java 併發包中ThreadLocalRandom 類原理剖析 80

3.1 Random 類及其侷限性 80

3.2 ThreadLocalRandom 82

3.3 原始碼分析 84

3.4 總結 87

第4 章 Java 併發包中原子操作類原理剖析 88

4.1 原子變數操作類 88

4.2 JDK 8 新增的原子操作類LongAdder 93

4.2.1 LongAdder 簡單介紹 93

4.2.2 LongAdder 程式碼分析 95

4.2.3 小結 101

4.3 LongAccumulator 類原理探究 102

4.4 總結 104

第5 章 Java 併發包中併發List 原始碼剖析 105

5.1 介紹 105

5.2 主要方法原始碼解析 106

5.2.1 初始化 106

5.2.2 新增元素 106

5.2.3 獲取指定位置元素 108

5.2.4 修改指定元素 109

5.2.5 刪除元素 110

5.2.6 弱一致性的迭代器 111

5.3 總結 114

第6 章 Java 併發包中鎖原理剖析 115

6.1 LockSupport 工具類 115

6.2 抽象同步佇列AQS 概述 122

6.2.1 AQS——鎖的底層支援 122

6.2.2 AQS——條件變數的支援 128

6.2.3 基於AQS 實現自定義同步器 131

6.3 獨佔鎖ReentrantLock 的原理 136

6.3.1 類圖結構 136

6.3.2 獲取鎖 137

6.3.3 釋放鎖 142

6.3.4 案例介紹 143

6.3.5 小結 145

?6.4 讀寫鎖ReentrantReadWriteLock 的原理 145

6.4.1 類圖結構 145

6.4.2 寫鎖的獲取與釋放 147

6.4.3 讀鎖的獲取與釋放 151

6.4.4 案例介紹 156

6.4.5 小結 158

6.5 JDK 8 中新增的StampedLock 鎖探究 158

6.5.1 概述 158

6.5.2 案例介紹 160

6.5.3 小結 164

第7 章 Java 併發包中併發佇列原理剖析 165

7.1 ConcurrentLinkedQueue 原理探究 165

7.1.1 類圖結構 165

7.1.2 ConcurrentLinkedQueue 原理介紹 166

7.1.3 小結 181

7.2 LinkedBlockingQueue 原理探究 182

7.2.1 類圖結構 182

7.2.2 LinkedBlockingQueue 原理介紹 185

7.2.3 小結 194

7.3 ArrayBlockingQueue 原理探究 195

7.3.1 類圖結構 195

7.3.2 ArrayBlockingQueue 原理介紹 197

7.3.3 小結 202

7.4 PriorityBlockingQueue 原理探究 203

7.4.1 介紹 203

7.4.2 PriorityBlockingQueue 類圖結構 203

7.4.3 原理介紹 205

7.4.4 案例介紹 214

7.4.5 小結 216

7.5 DelayQueue 原理探究 217

7.5.1 DelayQueue 類圖結構 217

7.5.2 主要函式原理講解 219

7.5.3 案例介紹 222

7.5.4 小結 224

第8 章 Java 併發包中執行緒池ThreadPoolExecutor 原理探究 225

8.1 介紹 225

8.2 類圖介紹 225

8.3 原始碼分析 230

8.3.1 public void execute(Runnable command) 230

8.3.2 工作執行緒Worker 的執行 235

8.3.3 shutdown 操作 238

8.3.4 shutdownNow 操作 240

8.3.5 awaitTermination 操作 241

8.4 總結 242

第9 章 Java 併發包中ScheduledThreadPoolExecutor 原理探究 243

9.1 介紹 243

9.2 類圖介紹 243

9.3 原理剖析 245

9.3.1 schedule(Runnable command, long delay,TimeUnit unit) 方法 246

9.3.2 scheduleWithFixedDelay(Runnable command,long initialDelay, long delay,TimeUnit unit) 方法 252

9.3.3 scheduleAtFixedRate(Runnable command,long initialDelay,long period,TimeUnit unit) 方法 254

9.4 總結 255

第10 章 Java 併發包中執行緒同步器原理剖析 256

10.1 CountDownLatch 原理剖析 256

10.1.1 案例介紹 256

10.1.2 實現原理探究 259

10.1.3 小結 263

10.2 迴環屏障CyclicBarrier 原理探究 264

10.2.1 案例介紹 264

10.2.2 實現原理探究 268

10.2.3 小結 272

?10.3 訊號量Semaphore 原理探究 272

10.3.1 案例介紹 272

10.3.2 實現原理探究 276

10.3.3 小結 281

10.4 總結 281

第三部分 Java 併發程式設計實踐篇

第11 章 併發程式設計實踐 284

11.1 ArrayBlockingQueue 的使用 284

11.1.1 非同步日誌列印模型概述 284

11.1.2 非同步日誌與具體實現 285

11.1.3 小結 293

11.2 Tomcat 的NioEndPoint 中ConcurrentLinkedQueue 的使用 293

11.2.1 生產者——Acceptor 執行緒 294

11.2.2 消費者——Poller 執行緒 298

11.2.3 小結 300

11.3 併發元件ConcurrentHashMap 使用注意事項 300

11.4 SimpleDateFormat 是執行緒不安全的 304

11.4.1 問題復現 304

11.4.2 問題分析 305

11.4.3 小結 309

11.5 使用Timer 時需要注意的事情 309

11.5.1 問題的產生 309

11.5.2 Timer 實現原理分析 310

11.5.3 小結 313

11.6 對需要複用但是會被下游修改的引數要進行深複製 314

11.6.1 問題的產生 314

11.6.2 問題分析 316

11.6.3 小結 318

11.7 建立執行緒和執行緒池時要指定與業務相關的名稱 319

11.7.1 建立執行緒需要有執行緒名 319

11.7.2 建立執行緒池時也需要指定執行緒池的名稱 321

11.7.3 小結 325

11.8 使用執行緒池的情況下當程式結束時記得呼叫shutdown 關閉執行緒池 325

11.8.1 問題復現 325

11.8.2 問題分析 327

11.8.3 小結 329

11.9 執行緒池使用FutureTask 時需要注意的事情 329

11.9.1 問題復現 329

11.9.2 問題分析 332

11.9.3 小結 335

11.10 使用ThreadLocal 不當可能會導致記憶體洩漏 336

11.10.1 為何會出現記憶體洩漏 336

11.10.2 線上程池中使用ThreadLocal 導致的記憶體洩漏 339

11.10.3 在Tomcat 的Servlet 中使用ThreadLocal 導致記憶體洩漏 341

11.10.4 小結 344

11.11 總結 344

四、預售連結