目 錄
前言
自序
第1章 多線(xiàn)程原理與實(shí)戰(zhàn) 1
1.1 兩個(gè)技術(shù)面試故事 1
1.2 無(wú)處不在的進(jìn)程和線(xiàn)程 2
1.2.1 進(jìn)程的基本原理 3
1.2.2 線(xiàn)程的基本原理 5
1.2.3 進(jìn)程與線(xiàn)程的區(qū)別 8
1.3 創(chuàng)建線(xiàn)程的4種方法 8
1.3.1 Thread類(lèi)詳解 8
1.3.2 創(chuàng)建一個(gè)空線(xiàn)程 10
1.3.3 線(xiàn)程創(chuàng)建方法一:繼承Thread類(lèi)創(chuàng)建線(xiàn)程類(lèi) 12
1.3.4 線(xiàn)程創(chuàng)建方法二:實(shí)現(xiàn)Runnable接口創(chuàng)建線(xiàn)程目標(biāo)類(lèi) 13
1.3.5 優(yōu)雅創(chuàng)建Runnable線(xiàn)程目標(biāo)類(lèi)的兩種方式 16
1.3.6 通過(guò)實(shí)現(xiàn)Runnable接口的方式創(chuàng)建線(xiàn)程目標(biāo)類(lèi)的優(yōu)缺點(diǎn) 18
1.3.7 線(xiàn)程創(chuàng)建方法三:使用Callable和FutureTask創(chuàng)建線(xiàn)程 23
1.3.8 線(xiàn)程創(chuàng)建方法四:通過(guò)線(xiàn)程池創(chuàng)建線(xiàn)程 28
1.4 線(xiàn)程的核心原理 31
1.4.1 線(xiàn)程的調(diào)度與時(shí)間片 31
1.4.2 線(xiàn)程的優(yōu)先級(jí) 32
1.4.3 線(xiàn)程的生命周期 35
1.4.4 一個(gè)線(xiàn)程狀態(tài)的簡(jiǎn)單演示案例 37
1.4.5 使用Jstack工具查看線(xiàn)程狀態(tài) 40
1.5 線(xiàn)程的基本操作 41
1.5.1 線(xiàn)程名稱(chēng)的設(shè)置和獲取 41
1.5.2 線(xiàn)程的sleep操作 43
1.5.3 線(xiàn)程的interrupt操作 45
1.5.4 線(xiàn)程的join操作 48
1.5.5 線(xiàn)程的yield操作 53
1.5.6 線(xiàn)程的daemon操作 55
1.5.7 線(xiàn)程狀態(tài)總結(jié) 61
1.6 線(xiàn)程池原理與實(shí)戰(zhàn) 62
1.6.1 JUC的線(xiàn)程池架構(gòu) 63
1.6.2 Executors的4種快捷創(chuàng)建線(xiàn)程池的方法 65
1.6.3 線(xiàn)程池的標(biāo)準(zhǔn)創(chuàng)建方式 72
1.6.4 向線(xiàn)程池提交任務(wù)的兩種方式 73
1.6.5 線(xiàn)程池的任務(wù)調(diào)度流程 77
1.6.6 ThreadFactory(線(xiàn)程工廠) 79
1.6.7 任務(wù)阻塞隊(duì)列 81
1.6.8 調(diào)度器的鉤子方法 82
1.6.9 線(xiàn)程池的拒絕策略 84
1.6.10 線(xiàn)程池的優(yōu)雅關(guān)閉 87
1.6.11 Executors快捷創(chuàng)建線(xiàn)程池的潛在問(wèn)題 93
1.7 確定線(xiàn)程池的線(xiàn)程數(shù) 97
1.7.1 按照任務(wù)類(lèi)型對(duì)線(xiàn)程池進(jìn)行分類(lèi) 97
1.7.2 為IO密集型任務(wù)確定線(xiàn)程數(shù) 98
1.7.3 為CPU密集型任務(wù)確定線(xiàn)程數(shù) 100
1.7.4 為混合型任務(wù)確定線(xiàn)程數(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)行線(xià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 線(xiàn)程安全問(wèn)題 123
2.1.1 自增運(yùn)算不是線(xià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è)線(xiàn)程不安全的實(shí)現(xiàn)版本 132
2.3.3 一個(gè)線(xiàn)程安全的實(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 線(xiàn)程間通信 170
2.9.1 線(xiàn)程間通信的定義 170
2.9.2 低效的線(xiàn)程輪詢(xún) 170
2.9.3 wait方法和notify方法的原理 171
2.9.4 “等待-通知”通信模式演示案例 174
2.9.5 生產(chǎn)者-消費(fèi)者之間的線(xiàn)程間通信 177
2.9.6 需要在synchronized同步塊的內(nèi)部使用wait和notify 180
第3章 CAS原理與JUC原子類(lèi) 182
......