免费的性能午餐已经结束——Intel、AMD 和Sparc、PowerPC 等主要的处理器生产厂商,从前使用的提高CPU 性能的传统方法已经走到尽头,单核处理器的主频多年来一直踏步不前,当今主流的CPU 制造技术是超线程和多核架构。面对计算机性能的挑战和硬件架构的改变,迷惘的软件开发者们应何去何从?《Scala并发编程》为大家展示了一条光明的康庄大道!
《Scala并发编程》由Scala 语言的发明者,瑞士洛桑联邦理工大学教授Martin Odersky 的爱徒Aleksandar Prokopec 博士撰写。作者根据自己在Scala 语言开发团队中的工作经验,全面地介绍了并发编程技术。这些并发编程技术包括:并发程序设计的基础知识和背景知识、常用并发实用组件(如线程池、原子变量和并发集合)的用法、Scala 专用并发框架(Future 和Promise API)的用法、Scala 并行集合框架的用法、使用响应式扩展框架编写基于事件的程序和异步程序的方式、用于编写事务程序的ScalaSTM 库以及Actor 编程模型和Akka框架。
作者在《Scala并发编程》中列举的实例既介绍了理论知识又展示了实践方法,同时还能够开拓读者的编程思路。此外,作者还在每章末尾提供了大量编程习题,帮助读者测试和巩固知识。
目录
- 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