这是个人的《Java并发编程实战》阅读笔记整理系列的第一篇文章,这个系列包括对书中并发编程内容的整理、总结以及个人的一些感悟和实践心得。

1. 简介

《Java并发编程实战》是 Brian Goetz 等 6 位 Java 大师合著的介绍 Java 并发编程的经典著作,这部名著由浅入深的介绍了 Java 并发编程的诸多知识,是一本完美的Java并发参考手册, 豆瓣评分 9.0,可见其受欢迎程度。

jcip view

1.1. 内容概要

《Java并发编程实战》从并发性和线程安全性的基本概念出发,介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证线程安全的规则,如何将小的线程安全类组合成更大的线程安全类,如何利用线程来提高并发应用程序的吞吐量,如何识别可并行执行的任务,如何提高单线程子系统的响应性,如何确保并发程序执行预期任务,如何提高并发代码的性能和可伸缩性等内容,最后介绍了一些高级主题,如显式锁、原子变量、非阻塞算法以及如何开发自定义的同步工具类。

这本书介绍的是 Java 中 "并发编程" 这样的高级主题,不太适合初学者阅读。书中诸多的内容都较难理解,比如线程的 "竞态条件"、"同步机制"、"活跃性" 等等,如果对并发知之甚少,不熟悉操作系统层面的相关内容,阅读起来比较吃力。

1.2. 作者简介

本书作者都是Java Community Process JSR 166专家组(并发工具)的主要成员,并在其他很多JCP专家组里任职。Brian Goetz有20多年的软件咨询行业经验,并著有至少75篇关于Java开发的文章。Tim Peierls是“现代多处理器”的典范,他在BoxPop.biz、唱片艺术和戏剧表演方面也颇有研究。Joseph Bowbeer是一个Java ME专家,他对并发编程的兴趣始于Apollo计算机时代。David Holmes是《The Java Programming Language》一书的合著者,任职于Sun公司。Joshua Bloch是Google公司的首席Java架构师,《Effective Java》一书的作者,并参与著作了《Java Puzzlers》。Doug Lea是《Concurrent Programming》一书的作者,纽约州立大学 Oswego分校的计算机科学教授。

也许你对这几位大师不怎么熟悉,但是你一定读过它们的著作,尤其是 Joshua Bloch 的《Effective Java》,这本书也是 Java 开发者必读的书籍,目前已经出到了第三版。

如果经常编写并发程序,那么对于 Doug Lea 一定不会陌生,因为 Java 5 开始的很多并发工具(它们都在 java.util.concurrent 包中,简称 juc 包)都出自他的手笔,如 AbstractQueuedSynchronizerAtomicXxx 原子类、BlockingQueueConcurrentMapExecutorService 等等,几乎整个并发工具包的类都是他实现的。

1.3. 阅读建议

前边说过,尽管《Java并发编程实战》是经典著作,但是由于其内容的特殊性,存在一定的阅读门槛。如果英文过关,建议直接阅读英文版,对于大多数人只能阅读翻译的中文版本了,但中文版存在一些问题,诸多概念介绍的很官方,内容不够充实、通俗易懂,理解起来费力,也存在一些翻译不通顺的问题。

所以,如果你没有接触过并发编程,我建议先多读几遍。首先,硬着头皮全文通读一遍,不懂的地方先跳过,第一遍着重理解并发相关的一些概念和了解 Java 对并发的支持类库,做到"心中有数";然后,第二遍在精读,弄懂相关概念之后,重点方在类库的使用上,边读边实践;然后读第三遍,这次着重了解底层的原理,结合本书阅读 JDK 源码,比如掌握 AbstractQueuedSynchronizer(简称 AQS)设计原理和源码,这是 juc 并发包的基础。

我在阅读本书时,会结合自己的理解写一些读书笔记和感悟,尽量尝试用通俗易懂的文字来解释一些难以理解的内容,并通过大量的代码来实践。一方面,写读书笔记可以加深自己的理解,对书中内容持怀疑的态度,然后实践求证,这样才能算真正理解。另一方面,只读不练,那也是假把式,大脑会很快遗忘,边读书边实践边整理,还要时不时的 "温故" 才能 "知新"。

读书笔记相关的代码我都放在 这里

电子书 vs 纸质书

以前我一直尝试用手机上的"图书" app 来阅读,后来用 iPad 但发现 10.5 英寸太大了不好携带,又换成了手机。

手机上的 app 唯一的好处的可以定制学习目标,每天读多少时间、每年读多少本书。其缺点也很明显:

  1. 阅读效果差。碎片化的阅读对于技术书而言效果非常差,知识难以成体系的阅读,读后边的就遗忘前边的内容

  2. 翻阅不方便。因为技术类图书需要经常前后翻阅,知识体系前后连贯性非常强,而电子书恰好不容易翻阅

  3. 批注不方便。电子书尽管有批注的功能,但是批注往往是用来加深自己的理解,后边需要经常回头来看的,但是电子书这一点体验不是太好,尤其是技术类的PDF,加批注比较麻烦,比如扫描版的

  4. 视力损伤。电子设备会造成眼部疲劳,损伤视力,使用 kindle 这类的阅读器又不太方便阅读pdf

综上,我个人建议阅读纸质书,纸质书籍才是最好的阅读媒介。阅读时可以回顾之前的内容,每次按照知识体系阅读完整章节,保持内容的连贯性和完整性。可以结合电子书来辅助,比如做读书笔记和编写代码时在电脑上打开电子书作为参考。

本书的电子版我放在了百度云上,需要的可以在文末[1] 下载,仅供个人学习使用,勿用于商业用途。

1.4. 书中源码

本书的 官方网站 提供了书中的全部源代码,不过没有使用构建工具,自己还需要加入第三方包。我已经将源码整理成了 Maven 工程放到 github 上,可以直接 fork 使用。


相关阅读