Why

如果你说你要学习 Java 并发相关的知识,那这本书是你学习路上必读书目之一。其作者 Doug lea 这位大神,如果你看过并发包的源码,就会发现很多类上都有着他的大名,没错,当构建了并发的作者自己来写书讲述并发,可信度无疑在我这是拉满的。

这本书是2020年4月份开始读的,第一遍的时候由于我完全没有并发的相关基础,所以读的不明所以,对很多概念也是不太理解。

于是进行了穿插学习,买了极客时间的同名课程,讲的确实比书上简单了许多,因为知识密度小了,但是同时我也发现了,极客时间的课程作者的思路其实也是借鉴了这本书。

于是有了这本书的读书笔记。

但是这本书也有"缺点":

就是由于它本身比较薄,所以干活太多的情况下就没有填充太多代码,只给了最精简的能说明作者意图的片段。

这是个好事,作者认为这样就够了,足够你们学习,但是对于我这种没有基础的并发小白,我希望能接触到最直观的,能跑起来且对比鲜明的 demo, 所以我希望在这方面进行自己的补充,能够对刚接触并发的人有所帮助。

本书结构

看书的话我习惯先看序在看目录,一般来说这是最精华的部分,如果你有按内容分块阅读的习惯,可能早就开始这样做了,因为如果你不需要系统的学习,那么直接看目录然后找自己需要的章节是最快的。

哪怕你是系统的学习,也可以将目录作为自己学习的主线大纲,让自己学起来更加有目标和规划。

  • {% post_link 读书笔记/java并发编程实战/1/1.简介 1.简介 %}

【这一章作为本书中对于基本的编程概念的一个简介,不过是最基础并且粒度较大的概念介绍,并且基本上大家都知道这些概念,所以只扫一遍心中留个印象即可。】

第一部:基础知识 —— 第2章 ~ 第5章

重点介绍了**「并发性」「线程安全性「基本概念」,以及如何使用类库提供的「基本并发构建块」来构造线程安全的类**。在第一部分给出了一个清单,其中总结了这一部分中介绍的最重要的规则。

第2章

  • {% post_link 读书笔记/java并发编程实战/2/2.线程安全性与竞态条件 2.线程安全性与竞态条件 %}
  • {% post_link 读书笔记/java并发编程实战/2/2.1加锁机制 2.1加锁机制 %}
  • {% post_link 读书笔记/java并发编程实战/2/2.2锁与活跃性以及性能 2.2锁与活跃性以及性能 %}

第3章

  • {% post_link 读书笔记/java并发编程实战/3/1 1.可见性 %}

  • {% post_link 读书笔记/java并发编程实战/3/2 2.发布与逸出 %}

  • {% post_link 读书笔记/java并发编程实战/3/3 3.线程封闭 %}

  • {% post_link 读书笔记/java并发编程实战/3/4 4.不变性 %}

  • {% post_link 读书笔记/java并发编程实战/3/5 5.安全发布 %}

这两章构成了本书的基础。

在这两章中给出了几乎所有用于避免并发危险构造线程安全的类以及验证「线程安全」的「规则」

第4章

  • {% post_link 读书笔记/java并发编程实战/4/1 对象的组合(上) %}
  • {% post_link 读书笔记/java并发编程实战/4/2 对象的组合(中) %}
  • {% post_link 读书笔记/java并发编程实战/4/3 对象的组合(下) %}

介绍了如何将一些小的线程安全的类**「组合」**成更大的线程安全的类。

第5章 「基础构建模块」

因为第五章非常长,所以我按小节进行了切分:

  • {% post_link 读书笔记/java并发编程实战/5/1.同步容器类 1.同步容器类 %}

  • {% post_link 读书笔记/java并发编程实战/5/2.并发容器 2.并发容器 %}

  • {% post_link 读书笔记/java并发编程实战/5/3 3.阻塞队列和生产者 — 消费者模式 %}

  • {% post_link 读书笔记/java并发编程实战/5/4 4.阻塞方法与中断方法 %}

  • {% post_link 读书笔记/java并发编程实战/5/5 5.同步工具类 %}

  • {% post_link 读书笔记/java并发编程实战/5/6 6.构建高效且可伸缩的缓存结果 %}

本章节介绍了 JDK类库 中提供的并发构建模块:包括**「线程安全的容器类」** 和 「同步工具类」

【↑这一章是非常长的一章,涉及到了多种数据结构,非常重要,为避免单个文章太长,我将其以小节作为分割维度分割成了五个小节】

个人小结:

第一部分是非常重要的基础部分,涉及到了很多Java并发领域的基本概念。

而很多概念可能由于篇幅原因作者直接给出了结论,而缺少了证明过程。

如果是对于并发了解比较少的读者(比如我)往往无法将作者给出的结论与实际遇到的问题和代码进行联系。

同时很多代码是以片段的形式存在,没有给出对应的测试用例。

那么这个时候就需要自己动手,去将代码的测试用例补完,真正运行起来,复现作者所说的理论。这样才能有力的支撑自己

这一部分的实践环节是非常重要的,建立理论概念与实际代码的映射,才能对并发有更深入的理解,起到更好的学习效果。

第二部分:结构化并发应用程序 —— 第6章 ~ 第9章

这一部分主要介绍了如何利用「线程」来提高并发应用程序的吞吐量响应性

第6章 介绍了如何识别「可执行的任务」,以及如何在「任务执行框架」中执行它们。

  • {% post_link 读书笔记/java并发编程实战/6/6.任务执行(上) 任务执行(上) %}
  • {% post_link 读书笔记/java并发编程实战/6/6.任务执行(下) 任务执行(下) %}

单章小结:

其概念对应的代码是JDK 中的 ExecutorExecutorService类,最好看一下看这些类之间的关系,然后结合理论想一想是怎样将并发概念编写成具体的工具类库的,这里面的转换很值得思考。

第7章 介绍了如何使 任务和线程在执行完正常工作之前提前结束。在健壮的并发应用程序与看似能正常工作的应用程序之间的一个重要差异就是:如何实现取消以及关闭操作。

  • {% post_link 读书笔记/java并发编程实战/7/7.取消与关闭(上) 7.取消与关闭(上) %}
  • {% post_link 读书笔记/java并发编程实战/7/7.取消与关闭(中) 7.取消与关闭(中) %}
  • {% post_link 读书笔记/java并发编程实战/7/7.取消与关闭(下) 7.取消与关闭(下) %}

【核心就是在不同的场景下,使用不同的手段终结任务,并对比其不同的作用效果。也非常重要,同时非常开拓思路,比如任务对错误的处理,任务框架对突然停止的处理。】

第8章介绍了任务执行框架中的一些更高级的特性。

第9章介绍了如何提高单线程子系统的响应性

活跃性、性能与测试

第三部分(第10章 ~ 第12章)

介绍了如何确保并发程序执行预期的任务,以及如何获得理想的性能

第10章 介绍了如何避免一些使程序无法执行下去的活跃性故障

第11章 介绍了如何提高并发代码的性能可伸缩性

第12章 介绍了在测试并发代码的正确性和性能时可以采用的一些技术。

高级主题

第四部分(第13章 ~ 第16章)

介绍了资深开发人员可能感兴趣的一些主题:显式锁原子变量非阻塞算法以及如何开发自定义的同步工具类。

Q.E.D.

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

最是人间留不住,曾是惊鸿照影来。