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