部分旧书采用了标准图片,会可能出现少部分不同印次出版不同封面的情况,旧书无光盘、腰封、书衣、附件等,如有其他问题可咨询客服。
¥ 56.25 7.5折 ¥ 75 九品
库存2件
作者Aleksandar Prokopec
出版社电子工业出版社
ISBN9787121271731
出版时间2015-10
装帧平装
开本16开
定价75元
货号1089102469323669505
上书时间2024-11-17
并发处理方式无处不在。随着多核处理器在消费者市场中崛起,并发编程技术也在软件开发行业内取得了霸主地位。并发编程技术以前就在程序或计算机系统中被用于实现异步计算,并且自成一个学术领域,而现在并发程序设计已经变成了开发人员普遍使用的软件开发技术。因此,高级并发框架和库正在以惊人的速度发展。近年来,并发计算领域呈现出了与文艺复兴类似的蓬勃发展景象。
随着现代编程语言和并发框架抽象等级的提高,了解和使用这些语言和框架的时机已经变为极为重要的知识。仅掌握经典并发和异步基元(如线程、锁和监控器)的使用方式,已经不足以应对当前的形势。高级并发框架既可以解决传统并发问题,也可以为特定任务做出调整。因此,高级并发框架逐渐占领了并发编程领域。
本书介绍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 程序的开发环境;还介绍了使用SimpleBuild 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.learningconcurrencyobject 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 的“下载专区”,下载所有已购买的博文视点书籍的示例代码文件。
勘误表
尽管我们努力提高书籍的质量,但错误在所难免。如果你发现了我们书籍中的错误(不论是文字错误还是代码错误),请不吝指正。通过指出书中的错误,你不仅能够帮助其他读者,并且可以帮助我们提高后续版本的质量。如果你发现了错误,可以在博文视点网站相应图书的页面提交勘误信息。一旦你找到的错误被证实,你提交的信息就会被接受,我们的网站也会发布这些勘误信息。你可以随时浏览图书页面,查看已经发布的勘误信息。
Aleksandar Prokopec,是一位软件开发者,同时也是并发和分布式编程技术研究者。他拥有克罗地亚萨格勒布大学电子工程和计算学院的计算机专业硕士学位和瑞士洛桑联邦理工大学(EPFL)的计算机科学专业博士学位。作为 EPFL 博士助教和 Scala 语言开发团队成员,他积极为 Scala 编程语言做贡献,研究并发编程抽象、并行数据编程支持和 Scala并发数据结构。他编写了 Scala Parallel Collections 框架,这是一个高级的 Scala 并行数据编程库。他还参加了多个 Scala 并发库开发小组,开发了 Future、Promise 和 ScalaSTM 等抽象。
苏宝龙,1999年毕业于辽宁石化大学计算机系,从事过计算机硬件维修、网络和网站架设等计算机专业实践工作。投身计算机图书翻译行业已有十余年,译著超过三十余部,是一位优秀的、负责任的译者。
前言 XVII
1 简介 1
2 JVM 和Java 内存模型中的并发处理方式 13
3 构建并发程序的传统材料 47
4 使用Future 和Promise 对象编写异步程序 85
5 数据并行集合 121
6 使用Reactive Extensions 编写并发程序 153
7 基于软件的事务内存 189
8 Actor 227
9 实用并发技术 269
— 没有更多了 —
以下为对购买帮助不大的评价