第1章 多线程基础 / 1
; C; t1 C+ ~' e2 |- }1.1 线程的优雅关闭 / 1
( L$ B( B8 i* a: N1 B. J+ _1.1.1 stop与destory函数 / 1
9 t" W6 B5 ]( [% m1.1.2 守护线程 / 1
/ t& ]) K" p5 Z1.1.3 设置关闭的标志位 / 2
2 z3 K8 q# v% J% \" _' c1.2 InterruptedException与interrupt()函数 / 3
$ R( I4 i# H( s/ ~1.2.1 什么情况下会抛出Interrupted异常 / 3
( i: O6 s$ w. M0 M1.2.2 轻量级阻塞与重量级阻塞 / 4
3 G7 e% o' b3 M8 K1 D$ [/ m1.2.3 t.isInterrupted()与Thread.interrupted()的区别 / 59 S* Z" I) r' \0 B1 ~ V; D
1.3 synchronized关键字 / 5 c L) a; B' G& H
1.3.1 锁的对象是什么 / 5
2 q. w' K; |7 o0 C5 E1.3.2 锁的本质是什么 / 69 s7 W W5 \/ b: G6 a9 d# z5 Z3 b
1.3.3 synchronized实现原理 / 7
0 w6 h, B, F8 Q( d( g+ l1.4 wait与notify / 70 O0 ]- r1 o s( `' E
1.4.1 生产者?消费者模型 / 7! W [7 M# K6 Q2 M9 k' D- y' z
1.4.2 为什么必须和synchornized一起使用 / 8( G) [! b# \3 [6 f: q1 d
1.4.3 为什么wait()的时候必须释放锁 / 9
; R1 k) F1 [2 C3 C% b" z1 b1.4.4 wait()与notify()的问题 / 10
: A3 ]/ |4 X; g+ N- _1.5 volatile关键字 / 11
: L8 ?; k$ I3 _3 s1.5.1 64位写入的原子性(Half Write) / 11* l7 V: ~- ~7 R3 S1 j
1.5.2 内存可见性 / 11
8 [8 g4 S9 r& c9 B1.5.3 重排序:DCL问题 / 12) ~+ ?) l, s+ g' B* D
1.6 JMM与happen-before / 13
2 A1 `0 n& E/ d0 k8 T1.6.1 为什么会存在“内存可见性”问题 / 13$ w4 S0 V% @, k6 Q
1.6.2 重排序与内存可见性的关系 / 15
G: z) R$ c! V) T5 }/ @1.6.3 as-if-serial语义 / 166 K3 p5 d" ~5 I6 c0 [& v4 ~8 r
1.6.4 happen-before是什么 / 17
( y) H0 q' h) e, q1.6.5 happen-before的传递性 / 184 M; C* z: `# b! q- j) E5 ^
1.6.6 C 中的volatile关键字 / 19% \/ C( d* u6 k- c" z) [1 B
1.6.7 JSR-133对volatile语义的增强 / 20( }! p+ i+ p0 Z
1.7 内存屏障 / 20
4 Y; [6 Z7 L- Y0 \$ W1.7.1 Linux中的内存屏障 / 219 M& [( N' h- i1 R1 j) ]
1.7.2 JDK中的内存屏障 / 23
5 u% r2 k) {; G; r) z8 S, y1.7.3 volatile实现原理 / 240 n$ n3 c: J: I& m% B5 }& e& O
1.8 final关键字 / 25
, D6 k% J) \; P7 c1.8.1 构造函数溢出问题 / 25' a2 Z4 A* D& ~% ~
1.8.2 final的happen-before语义 / 26( X+ }- ^) l' m. O
1.8.3 happen-before规则总结 / 26
( E# A5 y2 H$ E( h5 ?9 a8 t2 T% t1.9 综合应用:无锁编程 / 27
0 T: }+ ` l: C/ N1.9.1 一写一读的无锁队列:内存屏障 / 27
+ Z; \+ ]$ Q( Z$ h1.9.2 一写多读的无锁队列:volatile关键字 / 27
) q# T; J% K: s N( J1.9.3 多写多读的无锁队列:CAS / 28$ {6 D- }, T0 k* l8 C: w% ~
1.9.4 无锁栈 / 285 }# J6 Z2 T% g# z' h
1.9.5 无锁链表 / 28
]* S6 r9 p7 |" l' m2 L+ \第2章 Atomic类 / 29
3 b2 T; Y7 H8 l- `, K) r j2.1 AtomicInteger和AtomicLong / 29) b2 o2 d8 o+ e& x9 _
2.1.1 悲观锁与乐观锁 / 31
# @3 i3 _9 z* J) M3 j2.1.2 Unsafe 的CAS详解 / 31
1 m, f/ x! p' J) Z2.1.3 自旋与阻塞 / 32; x) d. ]7 F3 c% t- P
2.2 AtomicBoolean和AtomicReference / 33
3 U1 p6 ?' S; u3 H# _* G2.2.1 为什么需要AtomicBoolean / 33/ O' X; k6 ]2 d# [( R
2.2.2 如何支持boolean和double类型 / 332 w3 X( n. |$ J# q& M& K, q% @
2.3 AtomicStampedReference和AtomicMarkable Reference / 34
$ Y' d/ Z$ h9 b2.3.1 ABA问题与解决办法 / 34
# Z Q7 m$ p& X. W6 H6 s2.3.2 为什么没有AtomicStampedInteger或AtomictStampedLong / 358 q& d, Z% H8 o* N# _7 O! D, W5 Q
2.3.3 AtomicMarkableReference / 365 @- Z6 l6 G3 ^! L7 r: d2 N8 ^) B
2.4 AtomicIntegerFieldUpdater、AtomicLongFieldUpdater和AtomicReferenceField Updater / 37
& \! R/ s9 Z+ U2.4.1 为什么需要AtomicXXXFieldUpdater / 370 d6 G) f, f2 @3 v! l) z
2.4.2 限制条件 / 38$ G1 }. L$ t; f! k
2.5 AtomicIntegerArray、AtomicLongArray和8 i% x6 X# v9 i
AtomicReferenceArray / 38- J: _9 P5 m9 k; B" w; e P; v
2.5.1 使用方式 / 38
$ w4 l. J$ u; X5 g; O; ^' X2.5.2 实现原理 / 39* X" q( V' F& ?+ V
2.6 Striped64与LongAdder / 40
& g, y5 M" o( r3 [2.6.1 LongAdder原理 / 40; A8 I* c2 y: r% t
2.6.2 终一致性 / 41
, G( _5 ?" g( J2 ^: R3 Q1 }2.6.3 伪共享与缓存行填充 / 42
& e8 K W' P# V: b l+ y+ f2.6.4 LongAdder核心实现 / 43
! k* W) D' M' h( r2.6.5 LongAccumulator / 470 f6 z4 {9 {9 H/ d
2.6.6 DoubleAdder与DoubleAccumulator / 47
! Y! d- Y/ h5 V$ r% u+ c第3章 Lock与Condition / 49
' l* D' v( a% V; \0 I! e3.1 互斥锁 / 49+ E$ B7 N+ D* w5 H
3.1.1 锁的可重入性 / 49
) a7 V, r/ m1 U3.1.2 类继承层次 / 49
. Z8 w5 Q4 r8 o! y3 r3.1.3 锁的公平性vs.非公平性 / 51
% g( ^ \7 }8 e3.1.4 锁实现的基本原理 / 51) `9 r7 c6 w: a+ h" E# j
3.1.5 公平与非公平的lock()实现差异 / 536 V9 Z) @6 S. M' `, N
3.1.6 阻塞队列与唤醒机制 / 55# L1 b4 f4 c: I1 S
3.1.7 unlock()实现分析 / 58
$ }7 U" V" M: v7 M4 a) D1 c B! B- ?3.1.8 lockInterruptibly()实现分析 / 594 h; X3 f) h: T& p( g4 T7 S- v
3.1.9 tryLock()实现分析 / 60
5 a' P1 ^, v( g3.2 读写锁 / 60
2 a. S0 h s, }: x' f3.2.1 类继承层次 / 60
& M1 d7 x9 n6 M: i& v3.2.2 读写锁实现的基本原理 / 61
3 f' g- s" c, }. R; n3.2.3 AQS的两对模板方法 / 62
1 c4 Z; ]* o/ ]3 g3.2.4 WriteLock公平vs.非公平实现 / 65: M) e& Y8 _' a3 I7 c& ^
3.2.5 ReadLock公平vs.非公平实现 / 67
: V) G i2 D% v1 Z- D* m3.3 Condition / 68
) I& O$ A. o$ ]3.3.1 Condition与Lock的关系 / 68
/ D" z; |3 X1 `- l2 ?3.3.2 Condition的使用场景 / 69
$ e/ e1 X5 m J6 Q3.3.3 Condition实现原理 / 71! h; t+ R$ W' @# I$ l
3.3.4 await()实现分析 / 72
; z x: f% z% g* U$ @5 \, ~2 j3.3.5 awaitUninterruptibly()实现分析 / 73# D' S: X, W/ M& b$ c
3.3.6 notify()实现分析 / 747 L# Y, F0 m7 B4 o
3.4 StampedLock / 75: }$ }' H( A- x2 {1 P A" S! D
3.4.1 为什么引入StampedLock / 75
2 c* b* \: E3 \ x$ x6 u/ M3.4.2 使用场景 / 757 N. C' ?& e" {: s( p. n0 {
3.4.3 “乐观读”的实现原理 / 77 h3 y; p+ | M& c6 X0 o' Y0 \
3.4.4 悲观读/写:“阻塞”与“自旋”策略实现差异 / 788 E' V/ r4 R J. o4 B6 V
第4章 同步工具类 / 832 `6 h. I$ t% `# W* Q; l4 K
4.1 Semaphore / 83) M3 N) O7 w8 v# s! R1 F" Q; G/ c
4.2 CountDownLatch / 84
2 ~- i! S6 X# ? V$ P: Q5 I* ^4.2.1 CountDownLatch使用场景 / 84' N. L& Y9 i5 c0 \0 L0 n4 J
4.2.2 await()实现分析 / 854 n; x7 b$ F, U$ J7 g
4.2.3 countDown()实现分析 / 858 h# ^" `4 j3 y2 u* t0 p' C& W
4.3 CyclicBarrier / 86
! o& _, i3 f3 C4 g3 r6 [4.3.1 CyclicBarrier使用场景 / 86
" d! w7 g5 n2 U4 G5 |4.3.2 CyclicBarrier实现原理 / 87, A. p$ O. b; I4 t; \+ z8 B2 h
4.4 Exchanger / 90
3 k8 i3 w0 p: }- c% H& S# x4.4.1 Exchanger使用场景 / 90
d; [6 \7 `9 _( Z8 O4.4.2 Exchanger 实现原理 / 915 u/ Y: D3 e) O1 _
4.4.3 exchange(V x)实现分析 / 92
$ [1 C6 z3 n2 o7 J, `' C4 r7 S4.5 Phaser / 94
8 X m: p/ G$ Y$ m# w d4.5.1 用Phaser替代CyclicBarrier和CountDownLatch / 947 N# I& k" `- p) D4 B" S
4.5.2 Phaser新特性 / 958 T9 J; [# _$ `& r. ?5 p# e
4.5.3 state变量解析 / 96* l* V. W o. |( D
4.5.4 阻塞与唤醒(Treiber Stack) / 98
' `5 h' J2 | v6 T. `( T1 R4.5.5 arrive()函数分析 / 99
* B. \5 n* z0 B* w6 c" @7 L4 h4.5.6 awaitAdvance()函数分析 / 101
. i( L; j7 g! O5 V$ l第5章 并发容器 / 104" p: y6 f) q+ x% O+ Z! Q6 U
5.1 BlockingQueue / 104- i7 F t/ v ~: T+ \ E
5.1.1 ArrayBlockingQueue / 105
) y5 {- N& W. Z+ \5.1.2 LinkedBlockingQueue / 106* t: n8 o$ {# a; O+ F. y5 [$ U
5.1.3 PriorityBlockingQueue / 109
1 W- T+ {2 X" g/ z9 e8 o/ S0 Z5.1.4 DelayQueue / 111
( l) h* o6 V! C7 J- E4 F5.1.5 SynchronousQueue / 113
* d+ a( [3 v0 y G8 J; F5.2 BlockingDeque / 121! y( y5 l8 M* c! y1 z/ P$ B. W
5.3 CopyOnWrite / 123
* J1 Z% Z3 ^- @& _+ E2 |6 l$ a8 m% S5.3.1 CopyOnWriteArrayList / 123; H8 A H9 K. h& J9 b% L0 K4 u
5.3.2 CopyOnWriteArraySet / 124* R% S) `) M; p: I8 Q: e
5.4 ConcurrentLinkedQueue/ Deque / 125
2 l1 t. R1 u& M3 S" H8 T5.5 ConcurrentHashMap / 130
/ g" s9 e: g2 |: X3 O# ?/ c5.5.1 JDK 7中的实现方式 / 130' R4 J! E1 ]" C2 l0 H3 Q" Z
5.5.2 JDK 8中的实现方式 / 138
5 v0 ]0 u+ G. F+ U p7 _5.6 ConcurrentSkipListMap/Set / 152
2 V, }3 ], z% e+ _* {5.6.1 ConcurrentSkipListMap / 153
9 a9 O5 B* a2 K! I. m5.6.2 ConcurrentSkipListSet / 162
0 y+ k( M6 c) Y" ~" S, Z/ H& D第6章 线程池与Future / 163* x& F; v0 X! U" [% w+ P
6.1 线程池的实现原理 / 163. D3 n" R5 E; J8 }; B6 h, x+ j7 Z
6.2 线程池的类继承体系 / 164
/ p$ p* Q7 b7 Y& T0 d3 B9 X3 p: R6.3 ThreadPoolExecutor / 165
! w9 C( j5 F. w( U, L6.3.1 核心数据结构 / 165
( G9 E6 b* k/ k7 d- I; l' I' U6.3.2 核心配置参数解释 / 165
4 s, G/ m% C( b6.3.3 线程池的优雅关闭 / 167
# d( s% \7 D! p+ M; u! k" e3 y6.3.4 任务的提交过程分析 / 1726 N" L9 X: a/ j, F
6.3.5 任务的执行过程分析 / 174+ Z+ r3 k. K, ` H$ K: [
6.3.6 线程池的4种拒绝策略 / 1796 w4 b) y! N6 h {+ O
6.4 Callable与Future / 180# c2 T. K+ p3 z: K2 k
6.5 ScheduledThreadPool Executor / 1832 _! n+ r% i$ X3 g E
6.5.1 延迟执行和周期性执行的原理 / 184' ]0 {3 ~- {; n
6.5.2 延迟执行 / 184
5 }9 D% O7 l8 g# `% L1 v1 ^( ?6.5.3 周期性执行 / 1855 @8 n, M8 K$ T$ q8 X L+ L9 [% @
6.6 Executors工具类 / 188
7 }3 `) V& e1 W5 w6 U& F$ q2 V第7章 ForkJoinPool / 1909 M! E& h7 j" {3 }9 B9 `
7.1 ForkJoinPool用法 / 190/ [' n/ o0 q4 d n; Z- I
7.2 核心数据结构 / 193
+ K, B" D- d* n0 u% K! g2 K" B7.3 工作窃取队列 / 195
, i1 T% X y! S. @! x: }7.4 ForkJoinPool状态控制 / 198
4 o2 ~" Q8 W# b2 u6 ?/ n7.4.1 状态变量ctl解析 / 1981 z) W2 j0 N! }3 H
7.4.2 阻塞栈Treiber Stack / 200
8 @( ~% j% E+ W, C6 a1 m) N) X8 J7.4.3 ctl变量的初始值 / 201) A, z2 ]$ U) a3 v* J1 i; _
7.4.4 ForkJoinWorkerThread状态与个数分析 / 201
# S" b+ b4 l. Z* Y' P" x! S7.5 Worker线程的阻塞-唤醒机制 / 202
1 ]6 w3 c; ~6 B) E; G7.5.1 阻塞?C入栈 / 2027 y, x: q: c7 T1 c! O- y' l
7.5.2 唤醒?C出栈 / 204
% B# Z7 x6 g7 \' i2 K c7.6 任务的提交过程分析 / 205
6 a0 \7 |( G* |" F4 }6 i' M7.6.1 内部提交任务pushTask / 206! A- x8 [5 y- n' A% Z
7.6.2 外部提交任务! V$ G' }/ K- I5 N8 n2 ?
addSubmission / 206
, U5 O) k& \- Z( t* V7.7 工作窃取算法:任务的执行过程分析 / 207
2 [/ t0 R. p+ J6 q0 A; W7.7.1 顺序锁 SeqLock / 209! ]3 n1 }$ b$ I: w b& x
7.7.2 scanGuard解析 / 210% C( J0 @$ s# J) d
7.8 ForkJoinTask的fork/join / 212
8 F; {, ?. e8 e7.8.1 fork / 213 q3 q2 V- g1 Z1 |
7.8.2 join的层层嵌套 / 213
' `, f, \* E6 x# C7.9 ForkJoinPool的优雅关闭 / 2229 f8 p, y/ w- C% @+ e/ R
7.9.1 关键的terminate变量 / 222
- q$ V* S: G) w$ u4 ?7.9.2 shutdown()与shutdownNow()的区别 / 223% C$ G$ A) u- W; Z) b& [; Z
第8章 CompletableFuture / 2263 o! `; k7 N( |
8.1 CompletableFuture用法 / 226
7 V/ _. ?) o) ^, N' s, B, E8.1.1 简单的用法 / 2266 i- u8 p) @7 \# ^9 G
8.1.2 提交任务:runAsync与supplyAsync / 226; C1 c1 j! ~, L9 t4 C' i# h5 V
8.1.3 链式的CompletableFuture:thenRun、thenAccept和thenApply / 227
7 p3 n, ^9 c3 j r( ^+ A; R: a8.1.4 CompletableFuture的组合:thenCompose与thenCombine / 229
% k5 G# _; X) v1 E8.1.5 任意个CompletableFuture的组合 / 231
, p/ h- _+ l, C8.2 四种任务原型 / 233
7 F9 I% J E: }4 _# R& S8.3 CompletionStage接口 / 233
4 [ F& O' k, N; F& G8.4 CompletableFuture内部原理 / 234# [9 k! Z; d/ M
8.4.1 CompletableFuture的构造:ForkJoinPool / 234: U. m! v- C% G3 P3 x- @
8.4.2 任务类型的适配 / 235
6 W- k+ z+ D2 ^8.4.3 任务的链式执行过程分析 / 237' f D% C. ]6 m) S
8.4.4 thenApply与thenApplyAsync的区别 / 241
2 }: B# E2 t! H2 k1 m* f8.5 任务的网状执行:有向无环图 / 242; Q3 c, q; x/ T' r g
8.6 allOf内部的计算图分析 / 244