Scala 并发编程
  • 推荐0
  • 收藏0
  • 浏览614

Scala 并发编程

Aleksandar Prokopec (作者)  苏宝龙 (译者)

  • 书  号:978-7-121-27173-1
  • 出版日期:2015-10-10
  • 页  数:340
  • 开  本:16(185*235)
  • 出版状态:上市销售
  • 原书名: Learning Concurrent Programming in Scala
  • 原书号:9781783281411
  • 维护人:张春雨
免费的性能午餐已经结束——Intel、AMD 和 Sparc、PowerPC 等主要的处理器生产厂商,从前使用的提高 CPU 性能的传统方法已经走到尽头,单核处理器的主频多年来一直踏步不前,当今主流的CPU 制造技术是超线程和多核架构。面对计算机性能的挑战和硬件架构的改变,迷惘的软件开发者们应何去何从?本书为大家展示了一条光明的康庄大道!
本书由 Scala 语言的发明者,瑞士洛桑联邦理工大学教授 Martin Odersky 的爱徒 Aleksandar Prokopec 博士撰写。作者根据自己在 Scala 语言开发团队中的工作经验,全面地介绍了并发编程技术。这些并发编程技术包括:并发程序设计的基础知识和背景知识、常用并发实用组件(如线程池、原子变量和并发集合)的用法、Scala 专用并发框架(Future 和 Promise API)的用法、Scala 并行集合框架的用法、使用响应式扩展框架编写基于事件的程序和异步程序的方式、用于编写事务程序的 ScalaSTM库以及 Actor 编程模型和 Akka 框架。作者在本书中列举的实例既介绍了理论知识又展示了实践方法,同时还能够开拓读者的编程思路。此外,作者还在每章末尾提供了大量编程习题,帮助读者测试和巩固知识。
√ 本书由Scala发明人亲传弟子执笔完成,颇具权威性
√ 语言之外,系统性地梳理了并发及并发编程的核心知识
√ 重点讲解Future和Promise API等Scala专用并发框架的用法
√ 实例精心,兼顾理论与实践,既启发编程思路又面向实战方法
【序】
并发和并行编程技术已经从内核程序设计和高性能计算等尖端领域延伸而出,发展成为每位程序员都必备的知识。当前并行和分布式计算系统已经变成了一种规范,大多数应用程序都使用并发处理方式,有些程序是为了提高性能,也有些程序是为了处理异步事件。
目前,大多数开发者都没有做好迎接这场变革的准备工作。也许他们在学校学习过传统的并发模型(基于线程和锁的),但是这类模型无法在确保可接受生产效率的前提下,以可靠的方式处理海量的并发工作。而且,线程和锁不仅难以使用还易于出错。开发者如果想要提高自己的水平,就必须使用等级更高且可组合性更高的并发抽象。
15 年前,我设计了 Scala 语言的前身 Funnel 语言。Funnel 是一种实验性编程语言,其核心中含有并发语义。这门语言将所有编程概念都表现为,以 functional Net 模型(join calculus 模型的面向对象版本)为基础的语法糖。尽管 join calculus 是非常优秀的理论,但经过一些实验后,我们认识到并发问题是多层面的,无法通过单一形式解决它。解决所有并发问题的万能灵药是不存在的;正确的解决方式是对症下药。你是否想要定义用于回应事件或数据流的异步计算?是否想要创建用于通过消息进行通信的独立实体?是否想要为可变数据定义事务?是否想要通过并行处理方式提高性能?Scala 语言提供了完成所有这些任务的抽象:Future 类、响应式事件流、Actor 类、事务内存和并行集合。
Scala 和这本书使我们走到了一起。当前有如此多的优秀并发抽象,通过编程语言以硬编码的方式实现它们好像意义不大。但我们通过 Scala 努力实现的目标,是能够在用户代码和库中更轻松地定义高级抽象的。通过这种工作模式,开发者可以定义用于处理各种并发程序设计层面的模块。所有这些模块都会建立在由主机系统提供的低等级内核上。现在回过头来看,这种工作模式确实取得了很好的效果。Scala 拥有当今功能最强、结构最简洁的并发编程库。本书将带你领略其中最重要的几个库的风采,使你了解这些库的擅长领域和使用它们的方式。
不是计算机专家就写不好计算机书籍。本书的作者 Aleksandar Prokopec 编写过多个最流行的 Scala 并发和并行编程库,他还发明过多个精妙的数据结构和算法。在推出这本书的同时,他还创建了网上教程和权威参考站点。我相信本书能够成为所有 Scala 并发和并行程序开发者的良师益友。我期望这本书能够成为对并发领域感兴趣的人的书架藏品,因为他们都预见到了正在快速发展的并发计算领域的美好未来。
——Martin Odersky Scala 语言的发明者,瑞士洛桑联邦理工大学教授


前言
并发处理方式无处不在。随着多核处理器在消费者市场中崛起,并发编程技术也在软件开发行业内取得了霸主地位。并发编程技术以前就在程序或计算机系统中被用于实现异步计算,并且自成一个学术领域,而现在并发程序设计已经变成了开发人员普遍使用的软件开发技术。因此,高级并发框架和库正在以惊人的速度发展。近年来,并发计算领域呈现出了与文艺复兴类似的蓬勃发展景象。
随着现代编程语言和并发框架抽象等级的提高,了解和使用这些语言和框架的时机已经变为极为重要的知识。仅掌握经典并发和异步基元(如线程、锁和监控器)的使用方式,已经不足以应对当前的形势。高级并发框架既可以解决传统并发问题,也可以为特定任务做出调整。因此,高级并发框架逐渐占领了并发编程领域。
本书介绍 Scala 语言高级并发编程技术。本书不仅详细介绍了各种并发主题,还介绍了并发编程的基础理论。同时,本书也介绍了多种主要的现代并发框架、这些框架的语义细节和使用这些框架的方式。这样做的目的是展示重要的并发抽象,同时让你了解在实践中使用这些抽象的方式。
我们相信当你阅读了这本书后,既可以掌握坚实的并发编程理论基础,又能够获得编写正确、高效并发程序的实用技巧。这些技巧是通向现代并发编程专家之路的基石。希望本书能够为你带来快乐。
本书的结构
本书的主要目标是帮助你掌握开发正确、高效并发程序的必备技巧。获得技巧的最佳方式是在实践中使用它。因此,获得编程技巧的最佳方式,是亲手编写程序。本书旨在通过一系列精心挑选的案例程序,全方位向你展示并发编程技术,从而使你掌握使用 Scala语言编写并发程序的方式。这些案例程序包括从最简单的 Hello World 示例程序,到错综复杂的高级并发程序。
本书中程序的一个最大共同点是,既简洁又独立。选取这类程序的优点有两个。首先,你可以不受干扰地学习大多数案例程序。尽管我们建议你按照先后顺序阅读本书的各个章节,但如果你想要先关注某个主题也不会有问题。其次,简洁性可以确保每个新概念都能够易于被掌握和理解。通过简单的示例程序,理解原子处理方式、内存争用和忙等待等问题要容易得多。但这不意味着这些示例程序,仅是为展示这些概念而专门编写的;尽管有些案例程序可能会被删去不相关的部分,但每个案例程序都是选自现实世界的真实案例。
我们强烈建议你在阅读本书的过程中,亲手编写和运行这些示例程序,而不应仅是消极地阅读它们。每个案例程序都会向你展示一个新概念,但是你只有亲手在实践中使用这些概念,才能彻底理解它们。通过亲手运行并发程序并观察其特殊效果获得的经验,比仅从纸上阅读它得到的经验要宝贵得多。因此,你应该下载 SBT,并在阅读本书前创建一个空白项目,这一点请参阅本书中介绍的详细步骤。本书选取的案例程序都比较短小,从而使你能够毫无压力地尝试它们。
本书每一章的末尾都有一组编程练习。这些练习专门用于测试你对该章内容的理解程度。我们建议你在阅读完一章内容后,至少做几道该章末尾的练习题。在大多数情况中,我们会避免展示 API 方法和它们的确切签名。这样做的原因有多个。首先,你随时可以在网上学习 ScalaDoc 文档介绍的 API。本书如果重复这些内容会浪费一些篇幅。其次,软件永远都处于不断变化的状态中。尽管 Scala 并发框架的设计者们努力使这些 API 具有稳定性,但这些方法的名称和签名也可能会偶尔改变。本书介绍了改变可能性不高的许多重要并发工具的语义,使用这些工具足以编写并发程序。
本书的目标不是事无巨细地介绍 Scala 并发 API 的所有知识。本书旨在介绍最重要的并发编程概念。掌握了本书介绍的知识后,你不仅可以阅读网上文档介绍的补充资料,还可以明确寻找这些资料的方向。本书不是详细介绍每个方法确切语义的 API 参考文档,教授你从这些参考资料获取知识的方式才是本书的目的。当你阅读了本书的内容后,你不仅可以了解各种并发库不同的运行方式,还能获得编写并发程序的思路。
本书的内容
本书根据各个并发编程主题,划分为多个章节。本书的内容涵盖 Scala 运行时系统中的基础并发 API、较复杂的并发基元和高级并发抽象概要。
第 1 章介绍编写并发程序的原因和一些背景知识。本章也介绍了 Scala 编程语言的基础知识,以便使你能够顺畅地阅读本书后面介绍的内容。
第 2 章介绍并发程序设计的基础知识。本章介绍了使用线程的方式、防止以并发方式访问共享内存的方式,以及 Java 内存模型(JMM)。
第 3 章介绍常用的并发实用组件,如线程池、原子变量和并发集合。本章还着重介绍了使用并发集合与 Scala 语言功能进行交互的方式。本书将重点放在高等级的现代并发编程框架上;因此,虽然本章概述了传统的并发编程技巧,但并非将重点放在这个方面。
第 4 章是第一个介绍 Scala 专用并发框架的章节。本章介绍了 Future 和 Promise API,以及在编写异步程序时正确使用这些 API 的方式。
第 5 章介绍 Scala 并行集合框架。本章介绍了在条件允许的情况下,通过并行方式处理集合操作的方式,以及通过这种方式提高性能的手段。
第 6 章介绍使用响应式扩展框架编写基于事件的程序和异步程序的方式。本章会介绍事件流操作与集合操作的对应关系、在线程之间传递事件的方式和使用事件流设计响应用户界面的方式。
第 7 章介绍用于编写事务程序的 ScalaSTM 库,使用该库可以获得更加安全、更加直观的共享内存编程模型。本章会介绍使用可伸缩的内存事务防止多个线程以并发方式访问共享内存的方式,还会介绍减少死锁和竞态条件的方式。
第 8 章介绍 Actor 编程模型和 Akka 框架。本章会介绍编写在多台计算机上运行的、以透明方式传递消息的分布式程序的方式。
第 9 章总结了前面各章介绍过的多种并发库。本章会介绍根据指定问题选择正确并发抽象的方式,还会介绍当设计较大的并发应用程序时,将多种并发抽象组合到一起的方式。我们建议你根据先后顺序阅读各个章节,但这并非严格要求。如果你已经很好地掌握了第 2 章介绍的内容,就可以直接学习大多数章节。对其他章节介绍的知识依赖程度较高的是第 9 章,因为这一章是对前面介绍的各个主题的总结。
阅读本书前需要具备的知识
本节介绍阅读本书之前,你需要具备的知识。本节介绍了安装 Java Development Kit(Java 开发工具集)的方式,它是用于运行 Scala 程序的开发环境;还介绍了使用 Simple Build Tool(SBT)项目构建工具运行各种示例程序的方式。
阅读本书前无须具备 IDE 知识。你可以根据自己的喜好选择编写代码的编辑器,如 Vim、Emacs、Sublime Text、Eclipse、IntelliJ IDEA 和 Notepad++等文本编辑器。
安装 JDK
Scala 程序不会被直接编译为机器码,因此它们无法像可执行程序那样在各种硬件平台上直接运行。Scala 编译器生成的是一种中间代码——Java 字节码。要运行这种中间代码,你的计算机必须安装 Java 虚拟机(JVM)软件。本节介绍下载和安装 Java Development Kit的方式,该开发环境集成了 Java 虚拟机和其他有用的工具。软件市场上有多个 JDK 版本。我们建议你使用 Oracle JDK 分发版本。你可通过下列步骤下载和安装这个版本的 Java Development Kit:
1.在你的浏览器中打开 URL:www.oracle.com/technetwork/java/javase/downloads/index.html。
2.如果你无法打开这个 URL,可以在搜索引擎中搜索关键字 JDK Download。
3.一旦你找到 Oracle 网站中的 Java SE 下载链接,应下载与你当前使用的操作系统(如32 位或 64 位的 Windows、Linux 或者 Mac OS X)对应的 JDK 7 版本。
4.如果你使用 Windows,那么只需运行安装程序即可。如果你使用 Mac OS X,则需
要打开 dmg 存档才能安装 JDK。如果你使用 Linux,则需要将 dmg 存档解压到 XYZ 目录,并在 PATH 变量中添加 bin 子目录:export PATH=XYZ/bin:$PATH
5.现在你就能够在命令行界面中运行 java 和 javac 命令了。输入 javac 命令,查看该命令是否可用(本书没有介绍配置这个命令的方式,但你可以通过运行它,查明它是否可用):javac
这样你的操作系统就安装好了 JDK。要验证这一点,只需执行 javac 命令,如第 5步骤所示。
安装和使用 SBT
SBT 是一种用于构建 Scala 项目的命令行工具。它的作用是编译 Scala 代码、管理依赖关系、进行持续编辑和测试、开发等。本书通篇都会使用 SBT,管理项目的依赖关系和运行示例程序。通过下列步骤可以安装 SBT:
1.浏览 http://www.scala-sbt.org/。
2.下载与你所用平台对应的安装文件。如果你使用 Windows,应下载 msi 安装文件。如果你使用 Linux 或 Mac OS X,应下载 zip 或 tgz 归档文件。
3.安装 SBT。如果你使用 Windows,只需运行安装文件即可。如果你使用 Linux 或Mac OS X,则应在主目录解压归档文件。
安装好 SBT 后就可以使用它了。通过下列步骤可以创建新的 SBT 项目:
1.如果你使用 Windows,应打开命令行界面。如果你使用 Linux 或 Mac OS X,应打开一个终端窗口。
2.创建一个名为 scala-concurrency-examples 的新目录:$ mkdir scala-concurrency-examples
3.切换到 scala-concurrency-examples 目录:$ cd scala-concurrency-examples
4.创建一个用于存储示例程序的源代码目录:$ mkdir src/main/scala/org/learningconcurrency/
5.使用编辑器创建定义文件 build.sbt。该文件用于定义各种项目属性。应在项目的根目录(scala-concurrency-examples)中创建该文件。应向定义文件中添加下列内容(注意,必须保留空白行):
name := "concurrency-examples"
version := "1.0"
scalaVersion := "2.11.1"
6.切换回终端窗口,并在项目的根目录运行 SBT:$ sbt
7.SBT 会启动一个响应式壳,我们可以使用该壳执行各种创建项目的命令。现在你就可以编写 Scala 程序了。打开编辑器,在 src/main/scala/org/learningconcurrency 目录中创建一个名为 HelloWorld.scala 的源代码文件。向
HelloWorld.scala 文件中添加下列内容:
package org.learningconcurrency
object HelloWorld extends App {
println("Hello, world!")
}
切换回已经启动 SBT 响应式壳的终端窗口,使用下面的命令运行这个程序:
> run
该程序运行后会输出下面的结果:
Hello, world!
通过上述步骤足以运行本书介绍的大部分示例程序。在运行这些示例程序时,偶尔可能会用到外部库。SBT 能够通过标准软件仓库自动解决部分外部库问题。在处理另一些外部库时,我们需要手动设置额外的软件仓库,因而需要向 build.sbt 文件添加下面的代码:
resolvers ++= Seq(
"Sonatype OSS Snapshots" at
"https://oss.sonatype.org/content/repositories/snapshots",
"Sonatype OSS Releases" at
"https://oss.sonatype.org/content/repositories/releases",
"Typesafe Repository" at
"http://repo.typesafe.com/typesafe/releases/"
)
现在我们已经添加了所有必要的软件仓库,因而就能够添加一些具体库了。通过向build.sbt 文件添加下面的代码,我们就可以使用 Apache Commons IO 库:
libraryDependencies += "commons-io" % "commons-io" % "2.4"
更改了 build.sbt 文件的内容后,必须重新加载所有正在运行的 SBT 实例。应在 SBT的响应式壳中,输入下列命令:
> reload
这能够使 SBT 检测到定义文件的所有更改情况,并在必要时下载额外的软件包。不同的 Scala 库拥有不同的命名空间,这种命名空间称为软件包。要获取指定软件包的内容,需要使用 import 语句。当我们第一次在某个示例程序中使用指定的并发库时,总是会展示必要的 import 语句组。如果之后还需要使用相同的库,我们不会重复列出相同的 import 语句。与此类似,为简洁起见我们不会在示例代码中重复列出软件包声明。我们约定一章中的 示 例 代 码 都 处 于 同 一 软 件 包 中 。 例 如 , 第 2 章 中 的 所 有 示 例 代 码 都 处 于org.learningconcurrency.ch2 软件包中。该章中每个示例程序的源代码文件都以下列代码开头:
package org.learningconcurrency
package ch2
因为本书主要介绍并发和异步操作,所以许多示例程序都会含有主线程停止运行后仍继续运行的并发计算。为了确保这些并发计算操作能够执行完毕,我们会使用运行 SBT 的JVM 实例中运行的大多数示例程序。因而向 build.sbt 文件添加了下面的代码:fork := false
在介绍需要在独立 JVM 进程中运行的示例程序时,我们会做明确说明并列出详细的处理步骤。
使用 Eclipse、IntelliJ IDEA 等 IDE
使用 Eclipse 或 IntelliJ IDEA 等集成开发环境(IDE)的好处,是能够通过自动方式编写、编译和运行 Scala 程序。这样就无须安装上一节介绍的 SBT。你可以使用 SBT 运行示例程序,也可以使用 IDE 运行示例程序。
在使用 IDE 运行本书的示例程序时有一点需要特别注意:Eclipse 和 IntelliJ IDEA 之类的编辑器会在独立的 JVM 进程中运行程序。如上一节所述,某些并发计算会在主线程停止后继续运行。为了确保这些计算操作能够执行完毕,有时需要在主执行流程的末尾添加sleep 语句,该语句会降低主线程的执行速度。本书的大多数示例程序已经添加 sleep 语句,但某些示例程序需要你亲自添加该语句。
本书面向的读者
本书主要面向已经掌握 Scala 顺序编程技术的开发者,以帮助这些开发者掌握编写正确并发程序的技术。本书假定你已经掌握了 Scala 编程语言的基础知识。贯穿本书始终,我们都努力使用简单的 Scala 功能,展示编写并发程序的方式。只要你具备 Scala 的基础知识,了解各种并发主题就不会有困难。这并不意味着本书仅限于供 Scala 开发者阅读。不论你拥有 Java 或.NET 专业背景,或者仅是一名编程语言爱好者,都能够从本书介绍的内容中获得启迪。对面向对象和函数式编程有基本的了解,也是阅读本书的先决条件。
本书还从更广阔的视角,对现代并发编程技术做了详细介绍。即使你已经掌握了多线程计算或 JVM 并发模型的基础知识,通过本书你也可以了解许多现代的高级并发实用组件。本书介绍的许多并发库仅处于进入主流编程语言的起步阶段,其中一部分是真正的尖端技术。
约定
本书使用多种字体区分多种信息。下面介绍这些字体和它们的含义。
文本中的代码、数据库中表的名称、文件夹名称、文件名、文件扩展名、路径名称、URL 示例、用户输入信息和 Twitter 账号使用下列字体:“然后,它会调用 square 方法计算局部变量 s 的值。”
代码块使用下面的字体:
object SquareOf5 extends App {
def square(x: Int): Int = x * x
val s = square(5)
println(s"Result: $s")
}
命令行界面中的输入信息和输出结果使用下列字体:
run-main-46: ...
Thread-80: New thread running.
run-main-46: ...
run-main-46: New thread joined.
新术语和重点词汇使用粗体。屏幕显示的信息、菜单和对话框中的内容使用下列字体:
“单击 Thread Dump 按钮后,Java VisualVM 会显示所有线程的堆栈跟踪信息,如下图所示:”
警告或重要提示使用这种方式表示。
提示和小技巧使用这种方式表示。
下载示例程序的代码
你可以从 http://www.broadview.com.cn 的“下载专区”,下载所有已购买的博文视点书籍的示例代码文件。
勘误表
尽管我们努力提高书籍的质量,但错误在所难免。如果你发现了我们书籍中的错误(不论是文字错误还是代码错误),请不吝指正。通过指出书中的错误,你不仅能够帮助其他读者,并且可以帮助我们提高后续版本的质量。如果你发现了错误,可以在博文视点网站相应图书的页面提交勘误信息。一旦你找到的错误被证实,你提交的信息就会被接受,我们的网站也会发布这些勘误信息。你可以随时浏览图书页面,查看已经发布的勘误信息。

目录

目录 阅读
第1章 简介
第2章 JVM 和 Java 内存模型中的并发处理方式
第3章 构建并发程序的传统材料
第4章 使用 Future 和 Promise 对象编写异步程序
第5章 数据并行集合
第6章 使用 Reactive Extensions 编写并发程序
第7章 基于软件的事务内存
第8章 Actor
第9章 实用并发技术

本书勘误

印次
  • 页码:14  •  行数:倒数第4行  •  印次: 2015

    这些在同一个“线程”中出现的独立控制流实体称为线程
    改为:
    这些在同一个“进程”中出现的独立控制流实体称为线程

    happyofhappy 提交于 2017/4/26 16:41:35
    张春雨 确认于 2017/5/3 15:30:18

读者评论

相关图书

Unreal Engine 4可视化设计:交互可视化、动画与渲染开发绝艺

Tom Shannon (作者) 龚震宇 (译者)

Shannon回答了有关UE4可视化问题的常见问题,解决了从数据导入和处理到照明、高级材料和渲染等问题。他揭示了UE4与传统渲染系统重要的不同之处,即使它们使用...

 

虫术——Python绝技

梁睿坤 (作者)

本书以大数据应用方面常用的语言Python为基础,从网络爬虫的实现原理入手,逐步引领读者进入网络爬虫的世界。在各类爬虫框架中,将Scrapy作为轴心,从多个维度...

¥99.00

Scala高性能编程

Vincent Theron (作者) 杨云 (译者)

Scala是一种表达能力非常强的语言,能够用非常简洁的代码表达丰富的业务含义。为了在生产上充分发挥Scala的能力,除了掌握其简洁的语法外,理解Scala在性能...

¥69.00

网络爬虫全解析——技术、原理与实践

罗刚 (作者)

本书介绍了如何开发网络爬虫。内容主要包括开发网络爬虫所需要的Java语法基础和网络爬虫的工作原理,如何使用开源组件HttpClient和爬虫框架Crawler4...

¥49.00

全栈数据之门

任柳江 (作者)

本书以数据分析领域最热的Python语言为主要线索,介绍了数据分析库numpy、Pandas与机器学习库scikit-learn,使用了可视化环境Orange ...

¥49.00

Druid实时大数据分析原理与实践

欧阳辰 刘麒贇 张海雷 高振源 许哲 (作者)

Druid 作为一款开源的实时大数据分析软件,最近几年快速风靡全球互联网公司,特别是对于海量数据和实时性要求高的场景,包括广告数据分析、用户行为分析、数据统计分...

¥59.00