前言
随着现代CPU的生产工艺从提升CPU主频转向多核化,即在一块芯片上集成多个CPU内核(Core),以往靠提升CPU自身处理能力来提升软件计算性能的这种“免费午餐”不复存在。在此背景下,多线程编程在充分利用计算资源、提高软件服务质量方面扮演了越来越重要的角色。然而,多线程编程并非一个简单地使用多个线程进行编程的数量问题,其还有自身的问题。好比俗话说的“一个和尚打水喝,两个和尚挑水喝,三个和尚没水喝”,简单地使用多个线程进行编程可能导致更加糟糕的计算效率。
设计模式相当于软件开发领域的“三十六计”,它为特定背景下反复出现的问题提供了一般性解决方案。多线程编程相关的设计模式为我们恰当地使用多个线程进行编程并达到提升软件服务质量这一目的提供了指引和参考。当然,设计模式不是菜谱。即便其是菜谱,我们也不能指望照着菜谱就能做出一道美味可口的菜肴,但我们又不能因此而否认菜谱存在的价值。
可惜的是,国外与多线程编程相关的设计模式图书多数采用C++作为描述语言,且书中所举的例子又多与应用开发人员的实际工作经历相去甚远。本书作为国内首部介绍多线程编程相关设计模式的原创图书,希望能够在为Java开发者普及多线程编程相关的设计模式方面开一个头。
本书采用Java语言和UML(Unified Modeling Language)作为描述语言,并结合笔者多年工作经历和相关实践经验,介绍了多线程环境下常用设计模式的来龙去脉:各个设计模式是什么样的、典型的实际应用场景、实际应用时需要注意的相关事项,以及各个设计模式的可复用实现代码。
本书第1章将对Jave多线程编程实战基础进行回顾,虽然这一章讲的是基础,但重点仍然是实战。所谓“温故而知新”,有一定多线程编程基础、经验的读者也不妨快速阅读一下这一章,说不定会有新的收获。
本书第2章从通用意义上介绍了“设计模式”这一概念,并引入了“多线程设计模式”。本书后续章节都假定读者已经掌握了这一章介绍的知识。
本书第3章到第14章将逐一详细讲解与多线程编程相关的12个常用设计模式。针对每个设计模式,相应章节会从以下几个方面进行详细讲解。
简介 这部分将简要介绍相应设计模式的由来及核心思想,以便读者能够快速地对相应的设计模式有一个初步认识。
架构 这部分会从静态(类及类之间的结构关系)和动态(类之间的交互)两个角度对相应的设计模式进行详细讲解。架构分别使用UML类图(Class Diagram)和序列图(Sequence Diagram)对模式的静态和动态两个方面进行描述。
实战案例解析 在相应设计模式架构的基础上,这部分会给出相关的实战案例并对其进行解析。不同于教科书式的范例,实战案例强调的是“实战”。因此在实战案例解析中,我们会先提出实战案例中面临的实际问题,并在此基础上结合相应的设计模式讲解如何解决这些问题。在实战案例解析中,我们会给出相关的Java代码,并讲解这些代码与相应的设计模式架构间的对应关系,以便读者进一步理解相应的设计模式。为了便于读者进行实验,本书给出的实战案例代码都力求做到可运行。实战案例解析有助于读者进一步理解相应的设计模式,并体验相应设计模式的应用场景。建议读者在阅读这部分时先关注重点,即实战案例中我们要解决哪些问题,相应的设计模式又是如何解决这些问题的,以及实战案例代码与相应的设计模式架构间的对应关系。而代码中与设计模式非强相关的细节则可以稍后关注。
评价与实现考量 这部分会对相应的设计模式在实现和应用过程中需要注意的一些事项、问题进行讲解,并讨论应用设计模式所带来的优缺点。另外,也会讨论相应设计模式的典型应用场景。
可复用实现代码 这部分会给出相应设计模式的可复用实现代码。编写设计模式的可复用实现代码有助于读者进一步理解相应的设计模式及其在实现和应用过程中需要注意的相关事项和问题,也便于读者在实际工作中应用相应的设计模式。
Java标准库实例 考虑到Java标准库的API设计过程中已经应用了许多设计模式,本书将尽可能地给出相应的设计模式在Java API中的应用情况。
相关模式 设计模式不是孤立存在的,一个具体的设计模式往往与其他设计模式之间存在某些联系。这部分会描述相应的设计模式与其他设计模式之间存在的关系。这当中可能涉及GOF(Gang Of Four)的设计模式,这类设计模式并不在本书的讨论范围之内。有需要这类知识的读者,请自行参考相关图书。
如果说本书第3~14章介绍的是“三十六计”中的各个基础计策,那么本书第15章则介绍了“三十六计”中的“连环计”——各个多线程设计模式彼此之间存在的联系。
本书第2版除更正了第1版中的错误之外,主要更新内容如下。
• 内容优化:新增了JDK 8、JDK 9中与多线程设计模式相关的内容。
• 代码优化:对代码进行了重构,并重新排版,使代码部分重点更突出、更易于阅读。
• 提高了插图的清晰度。
另外,为了保证书中的链接地址可以及时更新,不至于过期失效,本书专门将所有链接地址放到“Java多线程编程链接地址”文档中,如正文中标有参见链接[1]、链接[2]等字样时,可在该文档中查找相关链接。读者可在http://www.broadview.com.cn/38245页面下载或通过“读者服务”中提供的方式获取“Java多线程编程链接地址”文档。