并發(fā)編程相比 Java 中其他知識點的學習門檻較高,從而導致很多人望而卻步。但無論是職場面試,還是高并發(fā)/ 高流量系統(tǒng)的實現(xiàn),卻都離不開并發(fā)編程,于是能夠真正掌握并發(fā)編程的人成為了市場迫切需求的人才。本書通過圖文結(jié)合、通俗易懂的講解方式幫助大家完成多線程并發(fā)編程從入門到實踐的飛躍!全書分為三部分,第一部分為Java 并發(fā)編程基礎(chǔ)篇,主要講解Java 并發(fā)編程的基礎(chǔ)知識、線程有關(guān)的知識和并發(fā)編程中的其他相關(guān)概念,這些知識在高級篇都會有所使用,掌握了本篇的內(nèi)容,就為學習高級篇奠定了基礎(chǔ);第二部分為Java 并發(fā)編程高級篇,講解了Java 并發(fā)包中核心組件的實現(xiàn)原理,讓讀者知其然,也知其所以然,熟練掌握本篇內(nèi)容,對我們在日常開發(fā)高并發(fā)、高流量的系統(tǒng)時會大有裨益;第三部分為Java 并發(fā)編程實踐篇,主要講解并發(fā)組件的使用方法,以及在使用過程中容易遇到的問題和解決方法。
翟陸續(xù),花名加多,四川大學計算機學院研究生畢業(yè)。目前任淘寶網(wǎng)高級開發(fā)工程師,熱衷Java并發(fā)編程,對JUC包源碼有深入的研究,熟悉常用開源框架實現(xiàn)原理。薛賓田,四川大學計算機學院研究生畢業(yè),原阿里巴巴研發(fā)工程師,現(xiàn)在河南牧業(yè)經(jīng)濟學院信息工程學院擔任Java課程老師。
第一部分 Java 并發(fā)編程基礎(chǔ)篇
第1 章 并發(fā)編程線程基礎(chǔ) / 2
1.1 什么是線程 / 2
1.2 線程創(chuàng)建與運行 / 3
1.3 線程通知與等待 / 6
1.4 等待線程執(zhí)行終止的join 方法 / 16
1.5 讓線程睡眠的sleep 方法 / 19
1.6 讓出CPU 執(zhí)行權(quán)的yield 方法 / 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 的實現(xiàn)原理 / 42
1.11.3 ThreadLocal 不支持繼承性 / 45
1.11.4 InheritableThreadLocal 類 / 46
第2 章 并發(fā)編程的其他基礎(chǔ)知識 / 50
2.1 什么是多線程并發(fā)編程 / 50
2.2 為什么要進行多線程并發(fā)編程 / 51
2.3 Java 中的線程安全問題 / 51
2.4 Java 中共享變量的內(nèi)存可見性問題 / 52
2.5 Java 中的synchronized 關(guān)鍵字 / 54
2.5.1 synchronized 關(guān)鍵字介紹 / 54
2.5.2 synchronized 的內(nèi)存語義 / 55
2.6 Java 中的volatile 關(guān)鍵字 / 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 為何會出現(xiàn)偽共享 / 68
2.11.3 如何避免偽共享 / 70
2.11.4 小結(jié) / 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 總結(jié) / 77
第二部分 Java 并發(fā)編程高級篇
第3 章 Java 并發(fā)包中ThreadLocalRandom 類原理剖析 / 80
3.1 Random 類及其局限性 / 80
3.2 ThreadLocalRandom / 82
3.3 源碼分析 / 84
3.4 總結(jié) / 87
第4 章 Java 并發(fā)包中原子操作類原理剖析
4.1 原子變量操作類 / 88
4.2 JDK 8 新增的原子操作類LongAdder / 93
4.2.1 LongAdder 簡單介紹 / 93
4.2.2 LongAdder 代碼分析 / 95
4.2.3 小結(jié) / 101
4.3 LongAccumulator 類原理探究 / 102
4.4 總結(jié) / 104
第5 章 Java 并發(fā)包中并發(fā)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 總結(jié) / 114
第6 章 Java 并發(fā)包中鎖原理剖析 / 115
6.1 LockSupport 工具類 / 115
6.2 抽象同步隊列AQS 概述 / 122
6.2.1 AQS——鎖的底層支持 / 122
6.2.2 AQS——條件變量的支持 / 128
6.2.3 基于AQS 實現(xiàn)自定義同步器 / 131
6.3 獨占鎖ReentrantLock 的原理 / 136
6.3.1 類圖結(jié)構(gòu) / 136
6.3.2 獲取鎖 / 137
6.3.3 釋放鎖 / 142
6.3.4 案例介紹 / 143
6.3.5 小結(jié) / 145
6.4 讀寫鎖ReentrantReadWriteLock 的原理 / 145
6.4.1 類圖結(jié)構(gòu) / 145
6.4.2 寫鎖的獲取與釋放 / 147
6.4.3 讀鎖的獲取與釋放 / 151
6.4.5 小結(jié) / 158
6.5 JDK 8 中新增的StampedLock 鎖探究 / 158
6.5.1 概述 / 158
6.5.2 案例介紹 / 160
6.5.3 小結(jié) / 164
第7 章 Java 并發(fā)包中并發(fā)隊列原理剖析 / 165
7.1 ConcurrentLinkedQueue 原理探究 / 165
7.1.1 類圖結(jié)構(gòu) / 165
7.1.2 ConcurrentLinkedQueue 原理介紹 / 166
7.1.3 小結(jié) / 181
7.2 LinkedBlockingQueue 原理探究 / 182
7.2.1 類圖結(jié)構(gòu) / 182
7.2.2 LinkedBlockingQueue 原理介紹 / 185
7.2.3 小結(jié) / 194
7.3 ArrayBlockingQueue 原理探究 / 195
7.3.1 類圖結(jié)構(gòu) / 195
7.3.2 ArrayBlockingQueue 原理介紹 / 197
7.3.3 小結(jié) / 202
7.4 PriorityBlockingQueue 原理探究 / 203
7.4.1 介紹 / 203
7.4.2 PriorityBlockingQueue 類圖結(jié)構(gòu) / 203
7.4.3 原理介紹 / 205
7.4.4 案例介紹 / 214
7.4.5 小結(jié) / 216
7.5 DelayQueue 原理探究 / 217
7.5.1 DelayQueue 類圖結(jié)構(gòu) / 217
7.5.2 主要函數(shù)原理講解 / 219
7.5.3 案例介紹 / 222
7.5.4 小結(jié) / 224
第8 章 Java 并發(fā)包中線程池ThreadPoolExecutor 原理探究 / 225
8.1 介紹 / 225
8.2 類圖介紹 / 225
8.3 源碼分析 / 230
8.3.1 public void execute(Runnable command) / 230
8.3.2 工作線程Worker 的執(zhí)行 / 235
8.3.3 shutdown 操作 / 238
8.3.4 shutdownNow 操作 / 240
8.3.5 awaitTermination 操作 / 241
8.4 總結(jié) / 242
第9 章 Java 并發(fā)包中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 總結(jié) / 255
第10 章 Java 并發(fā)包中線程同步器原理剖析 / 256
10.1 CountDownLatch 原理剖析 / 256
10.1.1 案例介紹 / 256
10.1.2實現(xiàn)原理探究/259
10.1.3小結(jié)/263
10.2回環(huán)屏障CyclicBarrier原理探究/264
10.2.1案例介紹/264
10.2.2實現(xiàn)原理探究/268
10.2.3小結(jié)/272
11.1ArrayBlockingQueue的使用/284
11.1.1異步日志打印模型概述/284
11.1.2異步日志與具體實現(xiàn)/285
11.1.3小結(jié)/293
11.2Tomcat的NioEndPoint中ConcurrentLinkedQueue的使用/293
11.2.1生產(chǎn)者——Acceptor線程/294
11.2.2消費者——Poller線程/298
11.2.3小結(jié)/300
11.3并發(fā)組件ConcurrentHashMap使用注意事項/300
11.4SimpleDateFormat是線程不安全的/304
11.4.1問題復現(xiàn)/304
11.4.2問題分析/305
11.4.3小結(jié)/309
11.5使用Timer時需要注意的事情/309
11.5.1問題的產(chǎn)生/309
11.5.2Timer實現(xiàn)原理分析/310
11.5.3小結(jié)/313
11.6對需要復用但是會被下游修改的參數(shù)要進行深復制/314
11.6.1問題的產(chǎn)生/314
11.6.2問題分析/316
11.6.3小結(jié)/318
11.7創(chuàng)建線程和線程池時要指定與業(yè)務相關(guān)的名稱/319
11.7.1創(chuàng)建線程需要有線程名/319
11.7.2創(chuàng)建線程池時也需要指定線程池的名稱/321
11.7.3小結(jié)/325
11.8使用線程池的情況下當程序結(jié)束時記得調(diào)用shutdown關(guān)閉線程池/325
11.8.1問題復現(xiàn)/325
11.8.2問題分析/327
11.8.3小結(jié)/329
11.9線程池使用FutureTask時需要注意的事情/329
11.9.1問題復現(xiàn)/329
11.9.2問題分析/332
11.9.3小結(jié)335
11.10使用ThreadLocal不當可能會導致內(nèi)存泄漏/336
11.10.1為何會出現(xiàn)內(nèi)存泄漏/336
11.10.2在線程池中使用ThreadLocal導致的內(nèi)存泄漏/339
11.10.3在Tomcat的Servlet中使用ThreadLocal導致內(nèi)存泄漏/341
11.10.4小結(jié)/344
11.11總結(jié)/344