第1章 并发简介 1
1.1 并发轻而易举 2
1.1.1 推动并发 3
1.1.2 分时 6
1.1.3 两种并发编程模型 7
1.2 消息传递模型 8
1.2.1 协调和通信 10
1.2.2 流控制 12
1.2.3 分治策略 14
1.2.4 进程状态的概念 15
1.3 共享内存和共享状态模型 16
1.3.1 线程交错——同步的需要 18
1.3.2 竞争条件和海森堡bug 20
1.3.3 正确的内存可见性和happens-before原则 21
1.3.4 共享、阻塞和公平 22
1.3.5 异步与同步执行 24
1.3.6 Java的非阻塞I巭O 25
1.4 模式和范式 26
1.4.1 事件驱动的架构 28
1.4.2 响应式编程 29
1.4.3 actor范式 31
1.4.4 消息代理 32
1.4.5 软件事务性内存 33
1.4.6 并行集合 34
1.5 本章小结 35
第2章 并发模式初探 37
2.1 线程及其上下文 38
2.2 竞争条件 40
2.2.1 监视器模式 44
2.2.2 线程安全性、正确性和不变性 45
2.2.3 双重检查锁定 48
2.2.4 显式锁定 52
2.2.5 生产者卐消费者模式 60
2.2.6 比较和交换 66
2.3 本章小结 68
第3章 更多的线程模式 70
3.1 有界缓冲区 72
3.1.1 策略模式——客户端轮询 74
3.1.2 接管轮询和睡眠的策略 75
3.1.3 使用条件变量的策略 77
3.2 读写锁 78
3.2.1 易读的RW锁 80
3.2.2 公平锁 84
3.3 计数信号量 86
3.4 我们自己的重入锁 89
3.5 倒计时锁存器 91
3.6 循环屏障 95
3.7 future任务 97
3.8 本章小结 100
第4章 线程池 101
4.1 线程池 102
4.1.1 命令设计模式 104
4.1.2 单词统计 105
4.1.3 单词统计的另一个版本 107
4.1.4 阻塞队列 107
4.1.5 线程中断语义 111
4.2 fork-join池 111
4.2.1 Egrep——简易版 112
4.2.2 为什么要使用递归任务 113
4.2.3 任务并行性 116
4.2.4 使用fork-join API实现快速排序 117
4.2.5 map-reduce技术 124
4.3 线程的工作窃取算法 125
4.4 主动对象 128
4.4.1 隐藏和适应 129
4.4.2 使用代理 129
4.5 本章小结 132
第5章 提升并发性 133
5.1 无锁堆栈 134
5.1.1 原子引用 134
5.1.2 堆栈的实现 135
5.2 无锁的FIFO队列 137
5.2.1 流程如何运作 140
5.2.2 无锁队列 141
5.2.3 ABA问题 147
5.3 并发的哈希算法 152
5.3.1 add(v)方法 153
5.3.2 contains(v)方法 156
5.4 大锁的方法 157
5.5 锁条纹设计模式 159
5.6 本章小结 162
第6章 函数式并发模式 163
6.1 不变性 164
6.1.1 不可修改的包装器 165
6.1.2 持久数据结构 167
6.1.3 递归和不变性 169
6.2 future模式 170
6.2.1 apply方法 171
6.2.2 future——线程映射 173
6.2.3 future模式是异步的 174
6.2.4 糟糕的阻塞 177
6.2.5 函数组合 179
6.3 本章小结 182
第7章 actor模式 183
7.1 消息驱动的并发 183
7.1.1 什么是actor 185
7.1.2 状态封装 189
7.1.3 并行性在哪里 190
7.1.4 未处理的消息 192
7.1.5 become模式 193
7.1.6 让它崩溃并恢复 197
7.1.7 actor通信——ask模式 199
7.1.8 actor通信——tell模式 204
7.1.9 pipeTo模式 205
7.2 本章小结 207