推荐序
欣闻文海的《Java多线程编程实战指南》一书即将出版,我感到非常激动和兴奋。与文海相识于2014年,某一天InfoQ中文站的运营编辑给我转发了一封读者投稿邮件,稿件标题是“Java多线程编程模式实战指南之Active Object模式”。读完之后我立刻决定将其发布到InfoQ中文站上,因为这篇文章无论内容选取、技术方向还是文字水平都是我见过的上乘之作。文章在发布后也收到了很多读者的反馈,而该文章的作者正是文海。此后,文海又在InfoQ中文站上连载了多篇与Java多线程编程与设计模式相关的文章,这些文章均获得了不错的读者评价。
本书是文海多年工作经验的总结之作。众所周知,目前Java并发领域的经典好书大部分都是外版作品。不过值得欣喜的是,近一两年来,也有一些不错的国内开发者开始编写这个领域的图书,这些图书的口碑也相当不错。文海的这部著作针对Java并发编程但又不局限于这个领域,它将Java多线程编程与设计模式这两大主题有机地结合到了一起。实际上,目前市场上虽然既有关于Java多线程编程的图书,也有关于设计模式的图书,但这两类图书内容之间却难以产生交集。介绍Java多线程编程的图书会专门讲解多线程编程的方方面面,而介绍设计模式的图书一般会以经典的23个设计模式为蓝本,同时辅以一些简单的代码示例进行解读,但难以让读者真正领会设计模式在实际开发中所起的作用。而本书不仅深入透彻地分析了Java多线程编程的方方面面,还将其与设计模式有机地结合到了一起,介绍了主动对象模式、两阶段终止模式、生产者/消费者模式、流水线模式、线程池模式等会对实际项目开发起到积极指导作用的诸多模式。可以这么说,本书不仅会向大家介绍Java多线程编程的难点与重点,还会探讨在某些场景下该使用哪个模式,以及这样做会给项目带来什么好处。从这个意义上说,本书是Java多线程编程与设计模式理论的集大成者,相信会给广大的Java开发者带来切实的帮助。
目前已经是多核普及的时代,程序员也一定会编写面向多核的代码。虽然传统的SSH(特指Struts+Spring+Hibernate)依然在发挥着重要的作用,但不得不说的是,作为一名有追求的Java开发者,眼光不应该局限于此。每一名有理想的Java开发者都应该系统地学习有关多线程编程的知识,这不仅涉及程序语言与库的学习,还需要了解现代硬件体系架构(如CPU、缓存、内存等),同时辅以恰当的设计模式,这样才能在未来游刃有余、得心应手。
虽然本人已经出版过多本技术图书,但为别人的书作序还是□□次。因此,在写这篇序之前我通读了本书的全部内容。事实也印证了看书之前的猜想,文海的这本书绝对是他本人的心血之作,书中诸多的实际经验相信会给读者带来不一样的感受。诚然,目前与Java开发相关的技术图书已然汗牛充栋,但我相信,这本书应该是每一个对代码有追求、对模式有见地的读者书架上不可或缺的一本书。
InfoQ中文站Java主编 张龙
2015年9月14日于北京
前言
随着现代CPU的生产工艺从提升CPU主频转向多核化,即在一块芯片上集成多个CPU内核(Core),以往靠提升CPU自身处理能力来提升软件计算性能的这种“免费午餐”不复存在。在此背景下,多线程编程在充分利用计算资源、提高软件服务质量方面扮演了越来越重要的角色。然而,多线程编程并非一个简单地使用多个线程进行编程的数量问题,其还有自身的问题。好比俗话说的“一个和尚打水喝,两个和尚挑水喝,三个和尚没水喝”,简单地使用多个线程进行编程可能导致更加糟糕的计算效率。
设计模式相当于软件开发领域的“三十六计”,它为特定背景下反复出现的问题提供了一般性解决方案。多线程编程相关的设计模式为我们恰当地使用多个线程进行编程并达到提升软件服务质量这一目的提供了指引和参考。当然,设计模式不是菜谱。即便其是菜谱,我们也不能指望照着菜谱就能做出一道美味可口的菜肴,但我们又不能因此而否认菜谱存在的价值。
可惜的是,国外与多线程编程相关的设计模式图书多数采用C++作为描述语言,且书中所举的例子又多与应用开发人员的实际工作经历相去甚远。本书作为国内首部介绍多线程编程相关设计模式的原创图书,希望能够在为Java开发者普及多线程编程相关的设计模式方面开一个头。
本书采用Java语言和UML(Unified Modeling Language)作为描述语言,并结合笔者多年工作经历和相关实践经验,介绍了多线程环境下常用设计模式的来龙去脉:各个设计模式是什么样的、典型的实际应用场景、实际应用时需要注意的相关事项,以及各个设计模式的可复用实现代码。
本书□□章将对Jave多线程编程实战基础进行回顾,虽然这一章讲的是基础,但重点仍然是实战。所谓“温故而知新”,有一定多线程编程基础、经验的读者也不妨快速阅读一下这一章,说不定会有新的收获。
本书第2章从通用意义上介绍了“设计模式”这一概念,并引入了“多线程设计模式”。本书后续章节都假定读者已经掌握了这一章介绍的知识。
本书第3章到□□4章将逐一详细讲解与多线程编程相关的12个常用设计模式。针对每个设计模式,相应章节会从以下几个方面进行详细讲解。
简介 这部分将简要介绍相应设计模式的由来及核心思想,以便读者能够快速地对相应的设计模式有一个初步认识。
架构 这部分会从静态(类及类之间的结构关系)和动态(类之间的交互)两个角度对相应的设计模式进行详细讲解。架构分别使用UML类图(Class Diagram)和序列图(Sequence Diagram)对模式的静态和动态两个方面进行描述。
实战案例解析 在相应设计模式架构的基础上,这部分会给出相关的实战案例并对其进行解析。不同于教科书式的范例,实战案例强调的是“实战”。因此在实战案例解析中,我们会先提出实战案例中面临的实际问题,并在此基础上结合相应的设计模式讲解如何解决这些问题。在实战案例解析中,我们会给出相关的Java代码,并讲解这些代码与相应的设计模式架构间的对应关系,以便读者进一步理解相应的设计模式。为了便于读者进行实验,本书给出的实战案例代码都力求做到可运行。实战案例解析有助于读者进一步理解相应的设计模式,并体验相应设计模式的应用场景。建议读者在阅读这部分时先关注重点,即实战案例中我们要解决哪些问题,相应的设计模式又是如何解决这些问题的,以及实战案例代码与相应的设计模式架构间的对应关系。而代码中与设计模式非强相关的细节则可以稍后关注。
评价与实现考量 这部分会对相应的设计模式在实现和应用过程中需要注意的一些事项、问题进行讲解,并讨论应用设计模式所带来的优缺点。另外,也会讨论相应设计模式的典型应用场景。
可复用实现代码 这部分会给出相应设计模式的可复用实现代码。编写设计模式的可复用实现代码有助于读者进一步理解相应的设计模式及其在实现和应用过程中需要注意的相关事项和问题,也便于读者在实际工作中应用相应的设计模式。
Java标准库实例 考虑到Java标准库的API设计过程中已经应用了许多设计模式,本书将尽可能地给出相应的设计模式在Java API中的应用情况。
相关模式 设计模式不是孤立存在的,一个具体的设计模式往往与其他设计模式之间存在某些联系。这部分会描述相应的设计模式与其他设计模式之间存在的关系。这当中可能涉及GOF(Gang Of Four)的设计模式,这类设计模式并不在本书的讨论范围之内。有需要这类知识的读者,请自行参考相关图书。
如果说本书第3~14章介绍的是“三十六计”中的各个基础计策,那么本书□□5章则介绍了“三十六计”中的“连环计”——各个多线程设计模式彼此之间存在的联系。
本书第2版除更正了□□版中的错误之外,主要更新内容如下。
√ 内容优化:新增了JDK 8、JDK 9中与多线程设计模式相关的内容。
√ 代码优化:对代码进行了重构,并重新排版,使代码部分重点更突出、更易于阅读。
√ 提高了插图的清晰度。
另外,为了保证书中的链接地址可以及时更新,不至于过期失效,本书专门将所有链接地址放到“Java多线程编程链接地址”文档中,如正文中标有参见链接[1]、链接[2]等字样时,可在该文档中查找相关链接。读者可在http://www.broadview.com.cn/38245页面下载或通过“读者服务”中提供的方式获取“Java多线程编程链接地址”文档。