猜你喜欢
Java多线程编程实战指南:设计模式篇(第2版)

Java多线程编程实战指南:设计模式篇(第2版)

书籍作者:黄文海 ISBN:9787121382451
书籍语言:简体中文 连载状态:全集
电子书格式:pdf,txt,epub,mobi,azw3 下载次数:7761
创建日期:2021-02-14 发布日期:2021-02-14
运行环境:PC/Windows/Linux/Mac/IOS/iPhone/iPad/Kindle/Android/安卓/平板
内容简介

随着CPU多核时代的到来,多线程编程在充分利用计算资源、提高软件服务质量方面扮演了越来越重要的角色。解决多线程编程中频繁出现的普遍问题可以借鉴设计模式所提供的现成解决方案。然而,多线程编程相关的设计模式图书多采用C++作为描述语言,且书中所举的例子多与应用开发人员的实际工作相去甚远。本书采用Java语言和UML为描述语言,并结合作者多年工作经历及相关实践经验,介绍了多线程环境下常用设计模式的来龙去脉:各个设计模式是什么样的、典型的实际应用场景、实际应用时需要注意的事项及各个设计模式的可复用代码实现。本书第2版除更正了第1版中的错误外,还新增了JDK 8、JDK 9中与多线程设计模式相关的内容,并对代码进行了重构和重新排版,使代码部分重点更突出、更易于阅读,以及提高了插图的清晰度。本书适合有一定Java多线程编程基础、经验的读者阅读。

作者简介

黄文海,2004年开始从事软件开发工作,近几年从事软件项目管理工作。在其工作过程中积累了丰富的技术指导经验和企业内部培训经验。曾在InfoQ中文站和IBM developerWorks上发表过十几篇技术、项目管理文章。

编辑推荐
适读人群 :本书适合有一定Java多线程编程基础、经验的读者阅读。

本书用Java诠释多线程编程的“三十六计”——多线程设计模式,对每个设计模式的讲解都附有实战案例和源代码解析,从理论到实战经验,全面呈现常用多线程设计模式的来龙去脉。

本书第2版除更正了第1版中的错误外,还新增了JDK 8、JDK 9中与多线程设计模式相关的内容,并对代码进行了重构和重新排版,使代码部分重点更突出、更易于阅读,以及提高了插图的清晰度。


前言

推荐序


欣闻文海的《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)作为描述语言,并结合笔者多年工作经历和相关实践经验,介绍了多线程环境下常用设计模式的来龙去脉:各个设计模式是什么样的、典型的实际应用场景、实际应用时需要注意的相关事项,以及各个设计模式的可复用实现代码。

本书第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多线程编程链接地址”文档。


目录

第1章 Java多线程编程实战基础 1
1.1 无处不在的线程 1
1.2 线程的创建与运行 3
1.3 线程的状态与上下文切换 5
1.4 对线程的监视 8
1.5 原子性、内存可见性和重排序――重新认识synchronized
和volatile 11
1.6 多线程编程的优势和风险 13
1.7 多线程编程常用术语 14
第2章 设计模式简介 19
2.1 设计模式及其作用 19
2.2 多线程设计模式简介 22
2.3 设计模式的描述 23
第3章 Immutable Object(不可变对象)模式 25
3.1 Immutable Object模式简介 25
3.2 Immutable Object模式的架构 27
3.3 Immutable Object模式实战案例解析 29
3.4 Immutable Object模式的评价与实现考量 33
3.4.1 适用场景 33
3.4.2 对垃圾回收(Garbage Collection)的影响 34
3.4.3 使用等效或者近似的不可变对象 35
3.4.4 防御性复制 35
3.5 Immutable Object模式的可复用实现代码 35
3.6 Java标准库实例 35
3.7 相关模式 37
3.7.1 Thread Specific Storage模式(第10章) 37
3.7.2 Serial Thread Confinement模式(第11章) 37
3.8 参考资源 38
第4章 Guarded Suspension(保护性暂挂)模式 39
4.1 Guarded Suspension模式简介 39
4.2 Guarded Suspension模式的架构 39
4.3 Guarded Suspension模式实战案例解析 43
4.4 Guarded Suspension模式的评价与实现考量 50
4.4.1 内存可见性和锁泄漏(Lock Leak) 51
4.4.2 线程被过早地唤醒 52
4.4.3 嵌套监视器锁死 53
4.5 Guarded Suspension模式的可复用实现代码 56
4.6 Java标准库实例 56
4.7 相关模式 56
4.7.1 Promise模式(第6章) 57
4.7.2 Producer-Consumer模式(第7章) 57
4.8 参考资源 57
第5章 Two-phase Termination(两阶段终止)模式 58
5.1 Two-phase Termination模式简介 58
5.2 Two-phase Termination模式的架构 59
5.3 Two-phase Termination模式实战案例解析 61
5.4 Two-phase Termination模式的评价与实现考量 70
5.4.1 线程停止标志 71
5.4.2 生产者/消费者问题中的线程停止 71
5.4.3 隐藏而非暴露可停止线程 73
5.5 Two-phase Termination模式的可复用实现代码 73
5.6 Java标准库实例 73
5.7 相关模式 74
5.7.1 Producer-Consumer模式(第7章) 74
5.7.2 Master-Slave模式(第12章) 74
5.8 参考资源 74
第6章 Promise(承诺)模式 75
6.1 Promise模式简介 75
6.2 Promise模式的架构 75
6.3 Promise模式实战案例解析 78
6.4 Promise模式的评价与实现考量 81
6.4.1 异步方法的异常处理 82
6.4.2 轮询 82
6.4.3 异步任务的执行 83
6.5 Promise模式的可复用实现代码 84
6.6 Java标准库实例 85
6.7 相关模式 85
6.7.1 Guarded Suspension模式(第4章) 85
6.7.2 Active Object模式(第8章) 86
6.7.3 Master-Slave模式(第12章) 86
6.7.4 Factory Method(工厂方法)模式 86
6.8 参考资源 86
第7章 Producer-Consumer(生产者/消费者)模式 87
7.1 Producer-Consumer模式简介 87
7.2 Producer-Consumer模式的架构 87
7.3 Producer-Consumer模式实战案例解析 90
7.4 Producer-Consumer模式的评价与实现考量 93
7.4.1 产品的粒度 94
7.4.2 通道积压 94
7.4.3 非阻塞式反压与Reactive Streams规范 96
7.4.4 工作窃取算法 97
7.4.5 线程的停止 101
7.4.6 高性能、高可靠性的Producer-Consumer模式实现 101
7.5 Producer-Consumer模式的可复用实现代码 102
7.6 Java标准库实例 102
7.7 相关模式 102
7.7.1 Guarded Suspension模式(第4章) 102
7.7.2 Thread Pool模式(第9章) 103
7.8 参考资源 103
第8章 Active Object(主动对象)模式 104
8.1 Active Object模式简介 104
8.2 Active Object模式的架构 105
8.3 Active Object模式实战案例解析 108
8.4 Active Object模式的评价与实现考量 115
8.4.1 错误隔离 117
8.4.2 缓冲区监控 118
8.4.3 缓冲区饱和处理策略 118
8.4.4 Scheduler空闲工作者线程清理 119
8.5 Active Object模式的可复用实现代码 119
8.6 Java标准库实例 123
8.7 相关模式 123
8.7.1 Promise模式(第6章) 123
8.7.2 Producer-Consumer模式(第7章) 123
8.8 参考资源 124
第9章 Thread Pool(线程池)模式 125
9.1 Thread Pool模式简介 125
9.2 Thread Pool模式的架构 126
9.3 Thread Pool模式实战案例解析 128
9.4 Thread Pool模式的评价与实现考量 130
9.4.1 工作队列的选择 131
9.4.2 线程池大小调校 132
9.4.3 线程池监控 134
9.4.4 线程泄漏 135
9.4.5 可靠性与线程池饱和处理策略 135
9.4.6 死锁 138
9.4.7 线程池空闲线程清理 139
9.5 Thread Pool模式的可复用实现代码 140
9.6 Java标准库实例 140
9.7 相关模式 140
9.7.1 Two-phase Termination模式(第5章) 140
9.7.2 Promise模式(第6章) 141
9.7.3 Producer-Consumer模式(第7章) 141
9.8 参考资源 141
第10章 Thread Specific Storage(线程特有存储)模式 142
10.1 Thread Specific Storage模式简介 142
10.2 Thread Specific Storage模式的架构 144
10.3 Thread Specific Storage模式实战案例解析 146
10.4 Thread Specific Storage模式的评价与实现考量 149
10.4.1 在线程池环境下使用Thread Specific Storage模式 153
10.4.2 内存泄漏与伪内存泄漏 153
10.5 Thread Specific Storage模式的可复用实现代码 161
10.6 Java标准库实例 161
10.7 相关模式 162
10.7.1 Immutable Object模式(第3章) 162
10.7.2 Proxy(代理)模式 162
10.7.3 Singleton(单例)模式 162
10.8 参考资源 162
第11章 Serial Thread Confinement(串行线程封闭)模式 163
11.1 Serial Thread Confinement模式简介 163
11.2 Serial Thread Confinement模式的架构 163
11.3 Serial Thread Confinement模式实战案例解析 166
11.4 Serial Thread Confinement模式的评价与实现考量 170
11.5 Serial Thread Confinement模式的可复用实现代码 171
11.6 Java标准库实例 176
11.7 相关模式 177
11.7.1 Immutable Object模式(第3章) 177
11.7.2 Promise模式(第6章) 177
11.7.3 Producer-Consumer模式(第7章) 177
11.7.4 Thread Specific Storage模式(第10章) 177
11.8 参考资源 177
第12章 Master-Slave(主仆)模式 178
12.1 Master-Slave模式简介 178
12.2 Master-Slave模式的架构 178
12.3 Master-Slave模式实战案例解析 180
12.4 Master-Slave模式的评价与实现考量 187
12.4.1 子任务处理结果的收集 188
12.4.2 Slave参与者实例的负载均衡与工作窃取 189
12.4.3 可靠性与异常处理 190
12.4.4 Slave线程的停止 190
12.5 Master-Slave模式的可复用实现代码 190
12.6 Java标准库实例 204
12.7 相关模式 204
12.7.1 Two-phase Termination模式(第5章) 204
12.7.2 Promise模式(第6章) 204
12.7.3 Strategy(策略)模式 204
12.7.4 Template(模板)模式 205
12.7.5 Factory Method(工厂方法)模式 205
12.8 参考资源 205
第13章 Pipeline(流水线)模式 206
13.1 Pipeline模式简介 206
13.2 Pipeline模式的架构 207
13.3 Pipeline模式实战案例解析 212
13.4 Pipeline模式的评价与实现考量 219
13.4.1 Pipeline的深度 220
13.4.2 基于线程池的Pipe 220
13.4.3 错误处理 223
13.4.4 可配置的Pipeline 224
13.5 Pipeline模式的可复用实现代码 224
13.6 Java标准库实例 236
13.7 相关模式 236
13.7.1 Serial Thread Confinement模式(第11章) 236
13.7.2 Master-Slave模式(第12章) 237
13.7.3 Composite模式 237
13.8 参考资源 237
第14章 Half-sync/Half-async(半同步/半异步)模式 238
14.1 Half-sync/Half-async模式简介 238
14.2 Half-sync/Half-async模式的架构 238
14.3 Half-sync/Half-async模式实战案例解析 240
14.4 Half-sync/Half-async模式的评价与实现考量 249
14.4.1 队列积压 250
14.4.2 避免同步任务层处理过慢 251
14.5 Half-sync/Half-async模式的可复用实现代码 251
14.6 Java标准库实例 256
14.7 相关模式 256
14.7.1 Two-phase Termination模式(第5章) 256
14.7.2 Producer-Consumer模式(第7章) 256
14.7.3 Active Object模式(第8章) 256
14.7.4 Thread Pool模式(第9章) 257
14.8 参考资源 257
第15章 模式语言 258
15.1 设计模式之间的联系 258
15.2 Immutable Object模式 260
15.3 Guarded Suspension模式 261
15.4 Two-phase Termination模式 262
15.5 Promise模式 263
15.6 Producer-Consumer模式 264
15.7 Active Object模式 265
15.8 Thread Pool模式 266
15.9 Thread Specific Storage模式 267
15.10 Serial Thread Confinement模式 268
15.11 Master-Slave模式 269
15.12 Pipeline模式 270
15.13 Half-sync/Half-async模式 271
附录A 本书常用UML图指南 272
参考文献 281