Scala并发编程(第2版)
上QQ阅读APP看书,第一时间看更新

第2章JVM和JMM上的并发性

在某种程度上,所有非平凡的抽象都会被泄露。

——杰夫·阿特伍德(Jeff Atwood)

从诞生之日起,Scala 程序就主要运行在 JVM 上,这种设计也成就了众多的 Scala并发库。Scala 的内存模型、多线程能力以及线程间同步,都继承自 JVM。绝大部分高层次的 Scala 并发构造都基于本章介绍的底层原语。这些原语是实现并发计算的基本方式,可以说,本章介绍的 API和同步原语是 JVM上的并发编程的基石。在大部分情况下,用户需要避免直接使用底层并发技术,而应该使用后文会介绍的高层次并发抽象构造技术。不过,用户还需要掌握一些基础知识,比如什么是线程、为什么保护块优于忙等待、内存模型有何用处等。有理由相信,明白这些问题有助于理解高层次并发抽象构造。尽管有人说需要了解实现细节的抽象不是好的抽象,但是理解抽象背后的基础知识还是很有益处的。实际上,所有抽象在某种程度上都是会泄露底层细节的。

接下来,本章不仅会介绍JVM的并发计算基础,还会讨论它们和Scala中的具体特性是如何交互的。具体而言,本章涉及如下主题。

● 创建和启动线程,并等待其结束。

● 通过对象监控器和同步语句在线程之间进行通信。

● 利用卫式代码块避免忙等待。

● 易失变量的语义。

● JMM的规范及其重要性。

本章将介绍如何使用线程,这也是最基础的并发计算。