1 简介 1
并发程序设计 1
传统并发编程技术概述 2
现代并发范式 3
Scala的优点 4
预备知识 5
执行Scala程序 5
Scala基础知识 6
小结 11
练习 11
2 JVM和Java内存模型中的并发处理方式 13
进程和线程 14
创建和启动线程 16
原子执行方式 21
调整次序 25
监控器和同步 27
死锁 29
保卫锁 32
中断线程和正常关闭 36
Volatile变量 37
Java内存模型 39
不可变对象和final字段 41
小结 43
练习 43
3 构建并发程序的传统材料 47
Executor和ExecutionContext对象 48
原子型基元 52
原子变量 52
无锁编程 55
以明确方式实现锁 57
ABA问题 59
惰性值 61
并发集合 66
并发队列 68
并发集和映射 71
并发遍历 77
创建和处理进程 79
小结 81
练习 81
4 使用Future和Promise对象编写异步程序 85
Future类 86
执行Future计算 88
Future对象的回调函数 89
Future计算和异常 92
使用Try类型 93
致命异常 95
Future对象中的函数组合 95
Promise类 103
转换基于回调函数的API 106
扩展Future API 108
取消异步计算操作 109
Future对象和阻塞操作 112
等待Future对象 112
在异步计算内部执行阻塞操作 113
Scala Async库 114
可选的Future框架 117
小结 118
练习 119
5 数据并行集合 121
Scala集合概述 122
并行集合的用法 123
并行集合类的层次结构 126
配置并行等级 128
在JVM中度量性能 129
使用并行集合的注意事项 131
非可并行化集合 131
非可并行化操作 132
并行操作的副作用 134
不确定的并行操作 135
可交换和可结合操作符 137
组合使用并行集合和并发集合 139
弱一致性迭代器 140
实现自定义的并行集合 141
分离器 142
组合器 145
可选的数据并行框架 148
ScalaBlitz框架中的集合层次结构 149
小结 150
练习 151
6 使用Reactive Extensions编写并发程序 153
创建Observable对象 154
Observable对象和异常 157
Observable协定 158
实现自定义Observable对象 160
通过Future对象创建Observable对象 161
Subscription对象 162
组合Observable对象 165
嵌套的Observable对象 166
处理完善Observable对象失败的情况 171
Rx调度器 174
使用自定义调度器编写UI应用程序 176
Subject特征和自顶向下的响应式编程 181
小结 186
练习 186
7 基于软件的事务内存 189
原子变量带来的麻烦 190
使用基于软件的事务内存 194
事务引用 196
使用atomic语句 197
组合事务 198
事务与副作用 199
单操作事务 203
嵌套事务 205
事务和异常 208
重新尝试执行事务 212
通过超时设置重新尝试执行事务 216
事务集合 217
事务局部变量 218
事务数组 219
事务映射 221
小结 222
练习 223
8 Actor 227
使用Actor模型 228
创建Actor系统和Actor实例 230
管理无法正常处理的消息 233
Actor实例的行为和状态 234
Akka框架中的Actor层次结构 239
识别Actor对象 242
Actor对象的生命周期 245
Actor对象之间的通信 249
请求模式 251
转发模式 254
停止Actor对象 255
Actor监督 257
远程Actor对象 263
小结 266
练习 267
9 实用并发技术 269
工欲善其事,必先利其器 269
组合使用多种框架——编写远程文件管理器 273
创建文件系统模型 274
服务器接口 278
客户端导航API 280
客户端的用户界面 284
实现客户端程序的逻辑 288
改进远程文件管理器 293
调试并发程序 294
死锁和暂停处理过程 295
调试运行结果不正确的程序 299
性能调试 304
小结 310
练习 311