Java并發(fā)實(shí)現(xiàn)原理:JDK源碼剖析
定 價(jià):89 元
- 作者:余春龍
- 出版時(shí)間:2020/3/1
- ISBN:9787121379727
- 出 版 社:電子工業(yè)出版社
- 中圖法分類:TP312.8
- 頁碼:256
- 紙張:
- 版次:01
- 開本:16開
本書全面而系統(tǒng)地剖析了Java Concurrent包中的每一個(gè)部分,對(duì)并發(fā)的實(shí)現(xiàn)原理進(jìn)行了深刻的探討。全書分為8章,第1章從最基礎(chǔ)的多線程知識(shí)講起,理清多線程中容易誤解的知識(shí)點(diǎn),探究背后的原理,包括內(nèi)存重排序、happen-before、內(nèi)存屏障等;第2~8章,從簡(jiǎn)單到復(fù)雜,逐個(gè)剖析Concurrent包的每個(gè)部分,包括原子類、鎖、同步工具類、并發(fā)容器、線程池、ForkJoinPool、CompletableFuture共7個(gè)部分。本書遵循層層遞進(jìn)的邏輯,后一章建立在前一章的知識(shí)點(diǎn)基礎(chǔ)之上,建議讀者由淺入深,逐步深入閱讀。本書適合有一定Java開發(fā)經(jīng)驗(yàn)的工程師、架構(gòu)師閱讀。通過本書,讀者可以對(duì)多線程編程形成一個(gè)“深刻而直觀”的認(rèn)識(shí),而不是再僅僅停留在概念和理論層面。
中科院軟件所計(jì)算機(jī)碩士畢業(yè)。熱衷于高并發(fā)高可用架構(gòu)、業(yè)務(wù)建模、領(lǐng)域驅(qū)動(dòng)設(shè)計(jì),在十年的工作中,經(jīng)歷過游戲、社交、廣告、電商等各種類型的項(xiàng)目,積累了較豐富的工程經(jīng)驗(yàn)。
第1章 多線程基礎(chǔ) / 1
1.1 線程的優(yōu)雅關(guān)閉 / 1
1.1.1 stop與destory函數(shù) / 1
1.1.2 守護(hù)線程 / 1
1.1.3 設(shè)置關(guān)閉的標(biāo)志位 / 2
1.2 InterruptedException與interrupt()函數(shù) / 3
1.2.1 什么情況下會(huì)拋出Interrupted異常 / 3
1.2.2 輕量級(jí)阻塞與重量級(jí)阻塞 / 4
1.2.3 t.isInterrupted()與Thread.interrupted()的區(qū)別 / 5
1.3 synchronized關(guān)鍵字 / 5
1.3.1 鎖的對(duì)象是什么 / 5
1.3.2 鎖的本質(zhì)是什么 / 6
1.3.3 synchronized實(shí)現(xiàn)原理 / 7
1.4 wait與notify / 7
1.4.1 生產(chǎn)者?消費(fèi)者模型 / 7
1.4.2 為什么必須和synchornized一起使用 / 8
1.4.3 為什么wait()的時(shí)候必須釋放鎖 / 9
1.4.4 wait()與notify()的問題 / 10
1.5 volatile關(guān)鍵字 / 11
1.5.1 64位寫入的原子性(Half Write) / 11
1.5.2 內(nèi)存可見性 / 11
1.5.3 重排序:DCL問題 / 12
1.6 JMM與happen-before / 13
1.6.1 為什么會(huì)存在“內(nèi)存可見性”問題 / 13
1.6.2 重排序與內(nèi)存可見性的關(guān)系 / 15
1.6.3 as-if-serial語義 / 16
1.6.4 happen-before是什么 / 17
1.6.5 happen-before的傳遞性 / 18
1.6.6 C++中的volatile關(guān)鍵字 / 19
1.6.7 JSR-133對(duì)volatile語義的增強(qiáng) / 20
1.7 內(nèi)存屏障 / 20
1.7.1 Linux中的內(nèi)存屏障 / 21
1.7.2 JDK中的內(nèi)存屏障 / 23
1.7.3 volatile實(shí)現(xiàn)原理 / 24
1.8 final關(guān)鍵字 / 25
1.8.1 構(gòu)造函數(shù)溢出問題 / 25
1.8.2 final的happen-before語義 / 26
1.8.3 happen-before規(guī)則總結(jié) / 26
1.9 綜合應(yīng)用:無鎖編程 / 27
1.9.1 一寫一讀的無鎖隊(duì)列:內(nèi)存屏障 / 27
1.9.2 一寫多讀的無鎖隊(duì)列:volatile關(guān)鍵字 / 27
1.9.3 多寫多讀的無鎖隊(duì)列:CAS / 28
1.9.4 無鎖棧 / 28
1.9.5 無鎖鏈表 / 28
第2章 Atomic類 / 29
2.1 AtomicInteger和AtomicLong / 29
2.1.1 悲觀鎖與樂觀鎖 / 31
2.1.2 Unsafe 的CAS詳解 / 31
2.1.3 自旋與阻塞 / 32
2.2 AtomicBoolean和AtomicReference / 33
2.2.1 為什么需要AtomicBoolean / 33
2.2.2 如何支持boolean和double類型 / 33
2.3 AtomicStampedReference和AtomicMarkable Reference / 34
2.3.1 ABA問題與解決辦法 / 34
2.3.2 為什么沒有AtomicStampedInteger或AtomictStampedLong / 35
2.3.3 AtomicMarkableReference / 36
2.4 AtomicIntegerFieldUpdater、AtomicLongFieldUpdater和AtomicReferenceField Updater / 37
2.4.1 為什么需要AtomicXXXFieldUpdater / 37
2.4.2 限制條件 / 38
2.5 AtomicIntegerArray、AtomicLongArray和
AtomicReferenceArray / 38
2.5.1 使用方式 / 38
2.5.2 實(shí)現(xiàn)原理 / 39
2.6 Striped64與LongAdder / 40
2.6.1 LongAdder原理 / 40
2.6.2 最終一致性 / 41
2.6.3 偽共享與緩存行填充 / 42
2.6.4 LongAdder核心實(shí)現(xiàn) / 43
2.6.5 LongAccumulator / 47
2.6.6 DoubleAdder與DoubleAccumulator / 47
第3章 Lock與Condition / 49
3.1 互斥鎖 / 49
3.1.1 鎖的可重入性 / 49
3.1.2 類繼承層次 / 49
3.1.3 鎖的公平性vs.非公平性 / 51
3.1.4 鎖實(shí)現(xiàn)的基本原理 / 51
3.1.5 公平與非公平的lock()實(shí)現(xiàn)差異 / 53
3.1.6 阻塞隊(duì)列與喚醒機(jī)制 / 55
3.1.7 unlock()實(shí)現(xiàn)分析 / 58
3.1.8 lockInterruptibly()實(shí)現(xiàn)分析 / 59
3.1.9 tryLock()實(shí)現(xiàn)分析 / 60
3.2 讀寫鎖 / 60
3.2.1 類繼承層次 / 60
3.2.2 讀寫鎖實(shí)現(xiàn)的基本原理 / 61
3.2.3 AQS的兩對(duì)模板方法 / 62
3.2.4 WriteLock公平vs.非公平實(shí)現(xiàn) / 65
3.2.5 ReadLock公平vs.非公平實(shí)現(xiàn) / 67
3.3 Condition / 68
3.3.1 Condition與Lock的關(guān)系 / 68
3.3.2 Condition的使用場(chǎng)景 / 69
3.3.3 Condition實(shí)現(xiàn)原理 / 71
3.3.4 await()實(shí)現(xiàn)分析 / 72
3.3.5 awaitUninterruptibly()實(shí)現(xiàn)分析 / 73
3.3.6 notify()實(shí)現(xiàn)分析 / 74
3.4 StampedLock / 75
3.4.1 為什么引入StampedLock / 75
3.4.2 使用場(chǎng)景 / 75
3.4.3 “樂觀讀”的實(shí)現(xiàn)原理 / 77
3.4.4 悲觀讀/寫:“阻塞”與“自旋”策略實(shí)現(xiàn)差異 / 78
第4章 同步工具類 / 83
4.1 Semaphore / 83
4.2 CountDownLatch / 84
4.2.1 CountDownLatch使用場(chǎng)景 / 84
4.2.2 await()實(shí)現(xiàn)分析 / 85
4.2.3 countDown()實(shí)現(xiàn)分析 / 85
4.3 CyclicBarrier / 86
4.3.1 CyclicBarrier使用場(chǎng)景 / 86
4.3.2 CyclicBarrier實(shí)現(xiàn)原理 / 87
4.4 Exchanger / 90
4.4.1 Exchanger使用場(chǎng)景 / 90
4.4.2 Exchanger 實(shí)現(xiàn)原理 / 91
4.4.3 exchange(V x)實(shí)現(xiàn)分析 / 92
4.5 Phaser / 94
4.5.1 用Phaser替代CyclicBarrier和CountDownLatch / 94
4.5.2 Phaser新特性 / 95
4.5.3 state變量解析 / 96
4.5.4 阻塞與喚醒(Treiber Stack) / 98
4.5.5 arrive()函數(shù)分析 / 99
4.5.6 awaitAdvance()函數(shù)分析 / 101
第5章 并發(fā)容器 / 104
5.1 BlockingQueue / 104
5.1.1 ArrayBlockingQueue / 105
5.1.2 LinkedBlockingQueue / 106
5.1.3 PriorityBlockingQueue / 109
5.1.4 DelayQueue / 111
5.1.5 SynchronousQueue / 113
5.2 BlockingDeque / 121
5.3 CopyOnWrite / 123
5.3.1 CopyOnWriteArrayList / 123
5.3.2 CopyOnWriteArraySet / 124
5.4 ConcurrentLinkedQueue/ Deque / 125
5.5 ConcurrentHashMap / 130
5.5.1 JDK 7中的實(shí)現(xiàn)方式 / 130
5.5.2 JDK 8中的實(shí)現(xiàn)方式 / 138
5.6 ConcurrentSkipListMap/Set / 152
5.6.1 ConcurrentSkipListMap / 153
5.6.2 ConcurrentSkipListSet / 162
第6章 線程池與Future / 163
6.1 線程池的實(shí)現(xiàn)原理 / 163
6.2 線程池的類繼承體系 / 164
6.3 ThreadPoolExecutor / 165
6.3.1 核心數(shù)據(jù)結(jié)構(gòu) / 165
6.3.2 核心配置參數(shù)解釋 / 165
6.3.3 線程池的優(yōu)雅關(guān)閉 / 167
6.3.4 任務(wù)的提交過程分析 / 172
6.3.5 任務(wù)的執(zhí)行過程分析 / 174
6.3.6 線程池的4種拒絕策略 / 179
6.4 Callable與Future / 180
6.5 ScheduledThreadPool Executor / 183
6.5.1 延遲執(zhí)行和周期性執(zhí)行的原理 / 184
6.5.2 延遲執(zhí)行 / 184
6.5.3 周期性執(zhí)行 / 185
6.6 Executors工具類 / 188
第7章 ForkJoinPool / 190
7.1 ForkJoinPool用法 / 190
7.2 核心數(shù)據(jù)結(jié)構(gòu) / 193
7.3 工作竊取隊(duì)列 / 195
7.4 ForkJoinPool狀態(tài)控制 / 198
7.4.1 狀態(tài)變量ctl解析 / 198
7.4.2 阻塞棧Treiber Stack / 200
7.4.3 ctl變量的初始值 / 201
7.4.4 ForkJoinWorkerThread狀態(tài)與個(gè)數(shù)分析 / 201
7.5 Worker線程的阻塞-喚醒機(jī)制 / 202
7.5.1 阻塞–入棧 / 202
7.5.2 喚醒–出棧 / 204
7.6 任務(wù)的提交過程分析 / 205
7.6.1 內(nèi)部提交任務(wù)pushTask / 206
7.6.2 外部提交任務(wù)
addSubmission / 206
7.7 工作竊取算法:任務(wù)的執(zhí)行過程分析 / 207
7.7.1 順序鎖 SeqLock / 209
7.7.2 scanGuard解析 / 210
7.8 ForkJoinTask的fork/join / 212
7.8.1 fork / 213
7.8.2 join的層層嵌套 / 213
7.9 ForkJoinPool的優(yōu)雅關(guān)閉 / 222
7.9.1 關(guān)鍵的terminate變量 / 222
7.9.2 shutdown()與shutdownNow()的區(qū)別 / 223
第8章 CompletableFuture / 226
8.1 CompletableFuture用法 / 226
8.1.1 最簡(jiǎn)單的用法 / 226
8.1.2 提交任務(wù):runAsync與supplyAsync / 226
8.1.3 鏈?zhǔn)降腃ompletableFuture:thenRun、thenAccept和thenApply / 227
8.1.4 CompletableFuture的組合:thenCompose與thenCombine / 229
8.1.5 任意個(gè)CompletableFuture的組合 / 231
8.2 四種任務(wù)原型 / 233
8.3 CompletionStage接口 / 233
8.4 CompletableFuture內(nèi)部原理 / 234
8.4.1 CompletableFuture的構(gòu)造:ForkJoinPool / 234
8.4.2 任務(wù)類型的適配 / 235
8.4.3 任務(wù)的鏈?zhǔn)綀?zhí)行過程分析 / 237
8.4.4 thenApply與thenApplyAsync的區(qū)別 / 241
8.5 任務(wù)的網(wǎng)狀執(zhí)行:有向無環(huán)圖 / 242
8.6 allOf內(nèi)部的計(jì)算圖分析 / 244