Java 高並發核心編程. 卷2, 多線程、鎖、JMM、JUC、高並發設計模式
內容描述
本書聚焦Java並發編程基礎知識,介紹了Java多線程、線程池、
內置鎖、
JMM、CAS、JUC、高並發設計模式等並發編程方面的核心原理和實戰知識。
本書共分為10章。
第1~2章淺顯易懂地剖析多線程、線程池的核心原理和實戰使用,
揭秘線程安全問題和Java內置鎖的核心原理;
第3~4章細緻地講解CAS原理與JUC原子類、JMM的核心原理,揭秘CAS操作的弊端和兩類規避措施、
解密Java如何內存可見性和volatile關鍵字的底層知識;
第5章細緻地介紹JUC顯示鎖的原理和各種顯示鎖的使用;
第6章圖文並茂、深入淺出地闡述JUC高並發的基礎設施:AQS抽象同步器核心原理;
第7章介紹JUC容器類;
第8~10章介紹常見的Java高並發設計模式的原理和使用。
目錄大綱
前言
自序
1章多線程原理與實戰 1
1.1兩個技術面試故事 1
1.2無處不在的進程和線程 2
1.2.1進程的基本原理 3
1.2.2線程的基本原理 5
1.2.3進程與線程的區別 8
1.3創建線程的4種方法 8
1.3.1 Thread類詳解 8
1.3.2創建一個空線程 10
1.3.3線程創建方法一:繼承Thread類創建線程類 12
1.3.4線程創建方法二:實現Runnable接口創建線程目標類 13
1.3.5優雅創建Runnable線程目標類的兩種方式 16
1.3.6通過實現Runnable接口的方式創建線程目標類的優缺點 18
1.3.7線程創建方法三:使用Callable和FutureTask創建線程 23
1.3.8線程創建方法:通過線程池創建線程 28
1.4線程的核心原理 31
1.4.1線程的調度與時間片 31
1.4.2線程的優先級 32
1.4.3線程的生命週期 35
1.4.4一個線程狀態的簡單演示案例 37
1.4.5使用Jstack工具查看線程狀態 40
1.5線程的基本作 41
1.5.1線程名稱的設置和獲取 41
1.5.2線程的sleep作 43
1.5.3線程的interrupt作 45
1.5.4線程的join作 48
1.5.5線程的yield作 53
1.5.6線程的daemon作 55
1.5.7線程狀態總結 61
1.6線程池原理與實戰 62
1.6.1 JUC的線程池架構 63
1.6.2 Eecutors的4種快捷創建線程池的方法 65
1.6.3線程池的標準創建方式 72
1.6.4向線程池提交任務的兩種方式 73
1.6.5線程池的任務調度流程 77
1.6.6 ThreadFactory(線程工廠) 79
1.6.7任務阻塞隊列 81
1.6.8調度器的鉤子方法 82
1.6.9線程池的拒策略 84
1.6.10線程池的優雅關閉 87
1.6.11 Eecutors快捷創建線程池的潛在問題 93
1.7確定線程池的線程數 97
1.7.1按照任務類型對線程池進行分類 97
1.7.2為IO密集型任務確定線程數 98
1.7.3為CPU密集型任務確定線程數 100
1.7.4為混合型任務確定線程數 101
1.8 ThreadLocal原理與實戰 104
1.8.1 ThreadLocal的基本使用 104
1.8.2 ThreadLocal的使用場景 107
1.8.3使用ThreadLocal進行線程隔離 108
1.8.4使用ThreadLocal進行跨函數數據傳遞 109
1.8.5 ThreadLocal內部結構演進 110
1.8.6 ThreadLocal源碼分析 111
1.8.7 ThreadLocalMap源碼分析 114
1.8.8 ThreadLocal綜合使用案例 119
2章Java內置鎖的核心原理 123
2.1線程安全問題 123
2.1.1自增運算不是線程安全的 123
2.1.2臨界區資源與臨界區代碼段 126
2.2 synchronized關鍵字 127
2.2.1 synchronized同步方法 127
2.2.2 synchronized同步塊 128
2.2.3靜態的同步方法 130
2.3生產者-消費者問題 131
2.3.1生產者-消費者模式 131
2.3.2一個線程不安全的實現版本 132
2.3.3一個線程安全的實現版本 139
2.4 Java對象結構與內置鎖 140
2.4.1 Java對象結構 141
2.4.2 Mark Word的結構信息 143
2.4.3使用JOL工具查看對象的佈局 145
2.4.4大小端問題 149
2.4.5無鎖、偏向鎖、輕量級鎖和重量級鎖 150
2.5偏向鎖的原理與實戰 152
2.5.1偏向鎖的核心原理 152
2.5.2偏向鎖的演示案例 152
2.5.3偏向鎖的膨脹和撤銷 156
2.6輕量級鎖的原理與實戰 157
2.6.1輕量級鎖的核心原理 157
2.6.2輕量級鎖的演示案例 158
2.6.3輕量級鎖的分類 161
2.6.4輕量級鎖的膨脹 162
2.7重量級鎖的原理與實戰 162
2.7.1重量級鎖的核心原理 162
2.7.2重量級鎖的開銷 165
2.7.3重量級鎖的演示案例 166
2.8偏向鎖、輕量級鎖與重量級鎖的對比 169
2.9線程間通信 170
2.9.1線程間通信的定義 170
2.9.2低效的線程輪詢 170
2.9.3 wait方法和tify方法的原理 171
2.9.4 “等待-通知”通信模式演示案例 174
2.9.5生產者-消費者之間的線程間通信 177
2.9.6需要在synchronized同步塊的內部使用wait和tify 180
3章CAS原理與JUC原子類 182
3.1什麼是CAS 182
3.1.1 Unsafe類中的CAS方法 182
3.1.2使用CAS進行無鎖編程 185
3.1.3使用無鎖編程實現輕量級安全自增 186
3.1.4字段偏移量的計算 189
3.2 JUC原子類 191
3.2.1 JUC中的Atomic原子作包 191
3.2.2基礎原子類AtomicInteger 192
3.2.3數組原子類AtomicIntegerArray 194
3.2.4 AtomicInteger線程安全原理 195
3.3對像作的原子性 198
3.3.1引用類型原子類 198
3.3.2屬性更新原子類 200
3.4 ABA問題 201
3.4.1了解ABA問題 201
3.4.2 ABA問題解決方案 203
3.4.3使用AtomicStampedReference解決ABA問題 203
3.4.4使用AtomicMarkableReference解決ABA問題 205
3.5提升高並發場景下CAS作的性能 207
3.5.1以空間換時間:LongAdder 208
3.5.2 LongAdder的原理 211
3.6 CAS在JDK中的廣泛應用 218
3.6.1 CAS作的弊端和規避措施 218
3.6.2 CAS作在JDK中的應用 219
4章可見性與有序性的原理 220
4.1 CPU物理緩存結構 220
4.2並發編程的三大問題 222
4.2.1原子性問題 222
4.2.2可見性問題 223
4.2.3有序性問題 224
4.3硬件層的MESI協議原理 227
4.3.1總線鎖和緩存鎖 228
4.3.2 MSI協議 230
4.3.3 MESI協議及RFO請求 230
4.3.4 volatile的原理 234
4.4有序性與內存屏障 237
4.4.1重排序 237
4.4.2 As-if-Serial規則 238
4.4.3硬件層面的內存屏障 240
4.5 JMM詳解 242
4.5.1什麼是Java內存模型 243
4.5.2 JMM與JVM物理內存的區別 244
4.5.3 JMM的8個作 246
4.5.4 JMM如何解決有序性問題 248
4.5.5 volatile語義中的內存屏障 250
4.6 Happens-Before規則 251
4.6.1 Happens-Before規則介紹 252
4.6.2規則1:順序性規則 252
4.6.3規則2:volatile規則 252
4.6.4規則3:傳遞性規則 255
4.6.5規則4:監視鎖規則 255
4.6.6規則5:start()規則 256
4.6.7規則6:join()規則 257
4.7 volatile不具備原子性 258
4.7.1 volatile變量的自增實例 258
4.7.2 volatile變量的複合作不具備原子性的原理 260
5章JUC顯式鎖的原理與實戰 262
5.1顯式鎖 262
5.1.1顯式鎖Lock接口 263
5.1.2可重入鎖ReentrantLock 264
5.1.3使用顯式鎖的模板代碼 267
5.1.4基於顯式鎖進行“等待-通知”方式的線程間通信 269
5.1.5 LockSupport 273
5.1.6顯式鎖的分類 276
5.2悲觀鎖和樂觀鎖 279
5.2.1悲觀鎖存在的問題 279
5.2.2通過CAS實現樂觀鎖 279
5.2.3不可重入的自旋鎖 280
5.2.4可重入的自旋鎖 281
5.2.5 CAS可能導致“總線風暴” 283
5.2.6 CLH自旋鎖 285
5.3公平鎖與非公平鎖 293
5.3.1非公平鎖實戰 293
5.3.2公平鎖實戰 295
5.4可中斷鎖與不可中斷鎖 296
5.4.1鎖的可中斷搶占 296
作者介紹
尼恩
中南大學碩士,架構師,先後在華為、神州數碼從事技術研發工作,專注於高性能Web平台、
高性能通信、高性能搜索、數據挖掘等領域的架構設計和分析工作。