目 錄
前言
自序
第1章 多線程原理與實戰(zhàn) 1
1.1 兩個技術(shù)面試故事 1
1.2 無處不在的進程和線程 2
1.2.1 進程的基本原理 3
1.2.2 線程的基本原理 5
1.2.3 進程與線程的區(qū)別 8
1.3 創(chuàng)建線程的4種方法 8
1.3.1 Thread類詳解 8
1.3.2 創(chuàng)建一個空線程 10
1.3.3 線程創(chuàng)建方法一:繼承Thread類創(chuàng)建線程類 12
1.3.4 線程創(chuàng)建方法二:實現(xiàn)Runnable接口創(chuàng)建線程目標類 13
1.3.5 優(yōu)雅創(chuàng)建Runnable線程目標類的兩種方式 16
1.3.6 通過實現(xiàn)Runnable接口的方式創(chuàng)建線程目標類的優(yōu)缺點 18
1.3.7 線程創(chuàng)建方法三:使用Callable和FutureTask創(chuàng)建線程 23
1.3.8 線程創(chuàng)建方法四:通過線程池創(chuàng)建線程 28
1.4 線程的核心原理 31
1.4.1 線程的調(diào)度與時間片 31
1.4.2 線程的優(yōu)先級 32
1.4.3 線程的生命周期 35
1.4.4 一個線程狀態(tài)的簡單演示案例 37
1.4.5 使用Jstack工具查看線程狀態(tài) 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 線程狀態(tài)總結(jié) 61
1.6 線程池原理與實戰(zhàn) 62
1.6.1 JUC的線程池架構(gòu) 63
1.6.2 Executors的4種快捷創(chuàng)建線程池的方法 65
1.6.3 線程池的標準創(chuàng)建方式 72
1.6.4 向線程池提交任務的兩種方式 73
1.6.5 線程池的任務調(diào)度流程 77
1.6.6 ThreadFactory(線程工廠) 79
1.6.7 任務阻塞隊列 81
1.6.8 調(diào)度器的鉤子方法 82
1.6.9 線程池的拒絕策略 84
1.6.10 線程池的優(yōu)雅關(guān)閉 87
1.6.11 Executors快捷創(chuàng)建線程池的潛在問題 93
1.7 確定線程池的線程數(shù) 97
1.7.1 按照任務類型對線程池進行分類 97
1.7.2 為IO密集型任務確定線程數(shù) 98
1.7.3 為CPU密集型任務確定線程數(shù) 100
1.7.4 為混合型任務確定線程數(shù) 101
1.8 ThreadLocal原理與實戰(zhàn) 104
1.8.1 ThreadLocal的基本使用 104
1.8.2 ThreadLocal的使用場景 107
1.8.3 使用ThreadLocal進行線程隔離 108
1.8.4 使用ThreadLocal進行跨函數(shù)數(shù)據(jù)傳遞 109
1.8.5 ThreadLocal內(nèi)部結(jié)構(gòu)演進 110
1.8.6 ThreadLocal源碼分析 111
1.8.7 ThreadLocalMap源碼分析 114
1.8.8 ThreadLocal綜合使用案例 119
第2章 Java內(nèi)置鎖的核心原理 123
2.1 線程安全問題 123
2.1.1 自增運算不是線程安全的 123
2.1.2 臨界區(qū)資源與臨界區(qū)代碼段 126
2.2 synchronized關(guān)鍵字 127
2.2.1 synchronized同步方法 127
2.2.2 synchronized同步塊 128
2.2.3 靜態(tài)的同步方法 130
2.3 生產(chǎn)者-消費者問題 131
2.3.1 生產(chǎn)者-消費者模式 131
2.3.2 一個線程不安全的實現(xiàn)版本 132
2.3.3 一個線程安全的實現(xiàn)版本 139
2.4 Java對象結(jié)構(gòu)與內(nèi)置鎖 140
2.4.1 Java對象結(jié)構(gòu) 141
2.4.2 Mark Word的結(jié)構(gòu)信息 143
2.4.3 使用JOL工具查看對象的布局 145
2.4.4 大小端問題 149
2.4.5 無鎖、偏向鎖、輕量級鎖和重量級鎖 150
2.5 偏向鎖的原理與實戰(zhàn) 152
2.5.1 偏向鎖的核心原理 152
2.5.2 偏向鎖的演示案例 152
2.5.3 偏向鎖的膨脹和撤銷 156
2.6 輕量級鎖的原理與實戰(zhàn) 157
2.6.1 輕量級鎖的核心原理 157
2.6.2 輕量級鎖的演示案例 158
2.6.3 輕量級鎖的分類 161
2.6.4 輕量級鎖的膨脹 162
2.7 重量級鎖的原理與實戰(zhàn) 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方法和notify方法的原理 171
2.9.4 “等待-通知”通信模式演示案例 174
2.9.5 生產(chǎn)者-消費者之間的線程間通信 177
2.9.6 需要在synchronized同步塊的內(nèi)部使用wait和notify 180
第3章 CAS原理與JUC原子類 182
......