第1章 多綫程基礎 / 1
1.1 綫程的優雅關閉 / 1
1.1.1 stop與destory函數 / 1
1.1.2 守護綫程 / 1
1.1.3 設置關閉的標誌位 / 2
1.2 InterruptedException與interrupt()函數 / 3
1.2.1 什麼情況下會拋齣Interrupted異常 / 3
1.2.2 輕量級阻塞與重量級阻塞 / 4
1.2.3 t.isInterrupted()與Thread.interrupted()的區彆 / 5
1.3 synchronized關鍵字 / 5
1.3.1 鎖的對象是什麼 / 5
1.3.2 鎖的本質是什麼 / 6
1.3.3 synchronized實現原理 / 7
1.4 wait與notify / 7
1.4.1 生産者−消費者模型 / 7
1.4.2 為什麼必須和synchronized一起使用 / 8
1.4.3 為什麼wait()的時候必須釋放鎖 / 9
1.4.4 wait()與notify()的問題 / 10
1.5 volatile關鍵字 / 11
1.5.1 64位寫入的原子性(Half Write) / 11
1.5.2 內存可見性 / 11
1.5.3 重排序:DCL問題 / 12
1.6 JMM與happen-before / 13
1.6.1 為什麼會存在“內存可見性”問題 / 13
1.6.2 重排序與內存可見性的關係 / 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關鍵字 / 19
1.6.7 JSR-133對volatile語義的增強 / 20
1.7 內存屏障 / 20
1.7.1 Linux中的內存屏障 / 21
1.7.2 JDK中的內存屏障 / 23
1.7.3 volatile實現原理 / 24
1.8 final關鍵字 / 25
1.8.1 構造函數溢齣問題 / 25
1.8.2 final的happen-before語義 / 26
1.8.3 happen-before規則總結 / 26
1.9 綜閤應用:無鎖編程 / 27
1.9.1 一寫一讀的無鎖隊列:內存屏障 / 27
1.9.2 一寫多讀的無鎖隊列:volatile關鍵字 / 27
1.9.3 多寫多讀的無鎖隊列: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 實現原理 / 39
2.6 Striped64與LongAdder / 40
2.6.1 LongAdder原理 / 40
2.6.2 最終一緻性 / 41
2.6.3 僞共享與緩存行填充 / 42
2.6.4 LongAdder核心實現 / 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 鎖實現的基本原理 / 51
3.1.5 公平與非公平的lock()實現差異 / 53
3.1.6 阻塞隊列與喚醒機製 / 55
3.1.7 unlock()實現分析 / 58
3.1.8 lockInterruptibly()實現分析 / 59
3.1.9 tryLock()實現分析 / 60
3.2 讀寫鎖 / 60
3.2.1 類繼承層次 / 60
3.2.2 讀寫鎖實現的基本原理 / 61
3.2.3 AQS的兩對模闆方法 / 62
3.2.4 WriteLock公平vs.非公平實現 / 65
3.2.5 ReadLock公平vs.非公平實現 / 67
3.3 Condition / 68
3.3.1 Condition與Lock的關係 / 68
3.3.2 Condition的使用場景 / 69
3.3.3 Condition實現原理 / 71
3.3.4 await()實現分析 / 72
3.3.5 awaitUninterruptibly()實現分析 / 73
3.3.6 notify()實現分析 / 74
3.4 StampedLock / 75
3.4.1 為什麼引入StampedLock / 75
3.4.2 使用場景 / 75
3.4.3 “樂觀讀”的實現原理 / 77
3.4.4 悲觀讀/寫:“阻塞”與“自鏇”策略實現差異 / 78
第4章 同步工具類 / 83
4.1 Semaphore / 83
4.2 CountDownLatch / 84
4.2.1 CountDownLatch使用場景 / 84
4.2.2 await()實現分析 / 85
4.2.3 countDown()實現分析 / 85
4.3 CyclicBarrier / 86
4.3.1 CyclicBarrier使用場景 / 86
4.3.2 CyclicBarrier實現原理 / 87
4.4 Exchanger / 90
4.4.1 Exchanger使用場景 / 90
4.4.2 Exchanger 實現原理 / 91
4.4.3 exchange(V x)實現分析 / 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()函數分析 / 99
4.5.6 awaitAdvance()函數分析 / 101
第5章 並發容器 / 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中的實現方式 / 130
5.5.2 JDK 8中的實現方式 / 138
5.6 ConcurrentSkipListMap/Set / 152
5.6.1 ConcurrentSkipListMap / 153
5.6.2 ConcurrentSkipListSet / 162
第6章 綫程池與Future / 163
6.1 綫程池的實現原理 / 163
6.2 綫程池的類繼承體係 / 164
6.3 ThreadPoolExecutor / 165
6.3.1 核心數據結構 / 165
6.3.2 核心配置參數解釋 / 165
6.3.3 綫程池的優雅關閉 / 167
6.3.4 任務的提交過程分析 / 172
6.3.5 任務的執行過程分析 / 174
6.3.6 綫程池的4種拒絕策略 / 179
6.4 Callable與Future / 180
6.5 ScheduledThreadPool Executor / 183
6.5.1 延遲執行和周期性執行的原理 / 184
6.5.2 延遲執行 / 184
6.5.3 周期性執行 / 185
6.6 Executors工具類 / 188
第7章 ForkJoinPool / 190
7.1 ForkJoinPool用法 / 190
7.2 核心數據結構 / 193
7.3 工作竊取隊列 / 195
7.4 ForkJoinPool狀態控製 / 198
7.4.1 狀態變量ctl解析 / 198
7.4.2 阻塞棧Treiber Stack / 200
7.4.3 ctl變量的初始值 / 201
7.4.4 ForkJoinWorkerThread狀態與個數分析 / 201
7.5 Worker綫程的阻塞-喚醒機製 / 202
7.5.1 阻塞–入棧 / 202
7.5.2 喚醒–齣棧 / 204
7.6 任務的提交過程分析 / 205
7.6.1 內部提交任務pushTask / 206
7.6.2 外部提交任務addSubmission / 206
7.7 工作竊取算法:任務的執行過程分析 / 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的優雅關閉 / 222
7.9.1 關鍵的terminate變量 / 222
7.9.2 shutdown()與shutdownNow()的區彆 / 223
第8章 CompletableFuture / 226
8.1 CompletableFuture用法 / 226
8.1.1 最簡單的用法 / 226
8.1.2 提交任務:runAsync與supplyAsync / 226
8.1.3 鏈式的CompletableFuture:thenRun、thenAccept和thenApply / 227
8.1.4 CompletableFuture的組閤:thenCompose與thenCombine / 229
8.1.5 任意個CompletableFuture的組閤 / 231
8.2 四種任務原型 / 233
8.3 CompletionStage接口 / 233
8.4 CompletableFuture內部原理 / 234
8.4.1 CompletableFuture的構造:ForkJoinPool / 234
8.4.2 任務類型的適配 / 235
8.4.3 任務的鏈式執行過程分析 / 237
8.4.4 thenApply與thenApplyAsync的區彆 / 241
8.5 任務的網狀執行:有嚮無環圖 / 242
8.6 allOf內部的計算圖分析 / 244
· · · · · · (
收起)