编辑推荐

适读人群:《Java多线程编程实战指南(设计模式篇)》适合有一定Java多线程编程基础、经验的读者。
《Java多线程编程实战指南(设计模式篇)》用Java诠释多线程编程的“三十六计”——多线程设计模式。每个设计模式的讲解都附有实战案例及源码解析,从理论到实战经验,全面呈现常用多线程设计模式的来龙去脉。《Java多线程编程实战指南(设计模式篇)》是作者多年工作经验的总结,融合了作者独到的见解和思考,相信读者阅读后会受益匪浅。

内容简介

随着CPU多核时代的到来,多线程编程在充分利用计算资源、提高软件服务质量方面扮演了越来越重要的角色。而解决多线程编程中频繁出现的普遍问题可以借鉴设计模式所提供的现成解决方案。然而,多线程编程相关的设计模式书籍多采用C++作为描述语言,且书中所举的例子多与应用开发人员的实际工作相去甚远。《Java多线程编程实战指南(设计模式篇)》采用Java(JDK1.6)语言和UML为描述语言,并结合作者多年工作经历的相关实战案例,介绍了多线程环境下常用设计模式的来龙去脉:各个设计模式是什么样的及其典型的实际应用场景、实际应用时需要注意的事项以及各个模式的可复用代码实现。
《Java多线程编程实战指南(设计模式篇)》适合有一定Java多线程编程基础、经验的读者。

作者简介

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

目录

第1章Java多线程编程实战基础1
1.1无处不在的线程1
1.2线程的创建与运行2
1.3线程的状态与上下文切换5
1.4线程的监视7
1.5原子性、内存可见性和重排序――重新认识synchronized和volatile10
1.6线程的优势和风险11
1.7多线程编程常用术语13
第2章设计模式简介17
2.1设计模式及其作用17
2.2多线程设计模式简介20
2.3设计模式的描述21
第3章ImmutableObject(不可变对象)模式23
3.1ImmutableObject模式简介23
3.2ImmutableObject模式的架构25
3.3ImmutableObject模式实战案例27
3.4ImmutableObject模式的评价与实现考量31
3.5ImmutableObject模式的可复用实现代码32
3.6Java标准库实例32
3.7相关模式34
3.7.1ThreadSpecificStorage模式(第10章)34
3.7.2SerialThreadConfinement模式(第11章)34
3.8参考资源34
第4章GuardedSuspension(保护性暂挂)模式35
4.1GuardedSuspension模式简介35
4.2GuardedSuspension模式的架构35
4.3GuardedSuspension模式实战案例解析39
4.4GuardedSuspension模式的评价与实现考量45
4.4.1内存可见性和锁泄漏(LockLeak)46
4.4.2线程过早被唤醒46
4.4.3嵌套监视器锁死47
4.5GuardedSuspension模式的可复用实现代码50
4.6Java标准库实例50
4.7相关模式51
4.7.1Promise模式(第6章)51
4.7.2Producer-Consumer模式(第7章)51
4.8参考资源51
第5章Two-phaseTermination(两阶段终止)模式52
5.1Two-phaseTermination模式简介52
5.2Two-phaseTermination模式的架构53
5.3Two-phaseTermination模式实战案例56
5.4Two-phaseTermination模式的评价与实现考量63
5.4.1线程停止标志63
5.4.2生产者-消费者问题中的线程停止64
5.4.3隐藏而非暴露可停止的线程65
5.5Two-phaseTermination模式的可复用实现代码65
5.6Java标准库实例66
5.7相关模式66
5.7.1Producer-Consumer模式(第7章)66
5.7.2Master-Slave模式(第12章)66
5.8参考资源66
第6章Promise(承诺)模式67
6.1Promise模式简介67
6.2Promise模式的架构68
6.3Promise模式实战案例解析70
6.4Promise模式的评价与实现考量74
6.4.1异步方法的异常处理75
6.4.2轮询(Polling)75
6.4.3异步任务的执行75
6.5Promise模式的可复用实现代码77
6.6Java标准库实例77
6.7相关模式78
6.7.1GuardedSuspension模式(第4章)78
6.7.2ActiveObject模式(第8章)78
6.7.3Master-Slave模式(第12章)78
6.7.4FactoryMethod模式78
6.8参考资源79
第7章Producer-Consumer(生产者/消费者)模式80
7.1Producer-Consumer模式简介80
7.2Producer-Consumer模式的架构80
7.3Producer-Consumer模式实战案例解析83
7.4Producer-Consumer模式的评价与实现考量87
7.4.1通道积压87
7.4.2工作窃取算法88
7.4.3线程的停止92
7.4.4高性能高可靠性的Producer-Consumer模式实现92
7.5Producer-Consumer模式的可复用实现代码92
7.6Java标准库实例93
7.7相关模式93
7.7.1GuardedSuspension模式(第4章)93
7.7.2ThreadPool模式(第9章)93
7.8参考资源93
第8章ActiveObject(主动对象)模式94
8.1ActiveObject模式简介94
8.2ActiveObject模式的架构95
8.3ActiveObject模式实战案例解析98
8.4ActiveObject模式的评价与实现考量105
8.4.1错误隔离107
8.4.2缓冲区监控108
8.4.3缓冲区饱和处理策略108
8.4.4Scheduler空闲工作者线程清理109
8.5ActiveObject模式的可复用实现代码109
8.6Java标准库实例111
8.7相关模式112
8.7.1Promise模式(第6章)112
8.7.2Producer-Consumer模式(第7章)112
8.8参考资源112
第9章ThreadPool(线程池)模式113
9.1ThreadPool模式简介113
9.2ThreadPool模式的架构114
9.3ThreadPool模式实战案例解析116
9.4ThreadPool模式的评价与实现考量117
9.4.1工作队列的选择118
9.4.2线程池大小调校119
9.4.3线程池监控121
9.4.4线程泄漏122
9.4.5可靠性与线程池饱和处理策略122
9.4.6死锁125
9.4.7线程池空闲线程清理126
9.5ThreadPool模式的可复用实现代码127
9.6Java标准库实例127
9.7相关模式127
9.7.1Two-phaseTermination模式(第5章)127
9.7.2Promise模式(第6章)127
9.7.3Producer-Consumer模式(第7章)127
9.8参考资源128
第10章ThreadSpecificStorage(线程特有存储)模式129
10.1ThreadSpecificStorage模式简介129
10.2ThreadSpecificStorage模式的架构131
10.3ThreadSpecificStorage模式实战案例解析133
10.4ThreadSpecificStorage模式的评价与实现考量135
10.4.1线程池环境下使用ThreadSpecificStorage模式138
10.4.2内存泄漏与伪内存泄漏139
10.5ThreadSpecificStorage模式的可复用实现代码145
10.6Java标准库实例146
10.7相关模式146
10.7.1ImmutableObject模式(第3章)146
10.7.2Proxy(代理)模式146
10.7.3Singleton(单例)模式146
10.8参考资源147
第11章SerialThreadConfinement(串行线程封闭)模式148
11.1SerialThreadConfinement模式简介148
11.2SerialThreadConfinement模式的架构148
11.3SerialThreadConfinement模式实战案例解析151
11.4SerialThreadConfinement模式的评价与实现考量155
11.4.1任务的处理结果155
11.5SerialThreadConfinement模式的可复用实现代码156
11.6Java标准库实例160
11.7相关模式160
11.7.1ImmutableObject模式(第3章)160
11.7.2Promise模式(第6章)160
11.7.3Producer-Consumer模式(第7章)160
11.7.4ThreadSpecificStorage(线程特有存储)模式(第10章)161
11.8参考资源161

第12章Master-Slave(主仆)模式162
12.1Master-Slave模式简介162
12.2Master-Slave模式的架构162
12.3Master-Slave模式实战案例解析164
12.4Master-Slave模式的评价与实现考量171
12.4.1子任务的处理结果的收集172
12.4.2Slave参与者实例的负载均衡与工作窃取173
12.4.3可靠性与异常处理173
12.4.4Slave线程的停止174
12.5Master-Slave模式的可复用实现代码174
12.6Java标准库实例186
12.7相关模式186
12.7.1Two-phaseTermination模式(第5章)186
12.7.2Promise模式(第6章)186
12.7.3Strategy(策略)模式186
12.7.4Template(模板)模式186
12.7.5FactoryMethod(工厂方法)模式186
12.8参考资源187
第13章Pipeline(流水线)模式188
13.1Pipeline模式简介188
13.2Pipeline模式的架构189
13.3Pipeline模式实战案例解析194
13.4Pipeline模式的评价与实现考量208
13.4.1Pipeline的深度209
13.4.2基于线程池的Pipe209
13.4.3错误处理212
13.4.4可配置的Pipeline212
13.5Pipeline模式的可复用实现代码212
13.6Java标准库实例222
13.7相关模式222
13.7.1SerialThreadConfinement模式(第11章)222
13.7.2Master-Slave模式(第12章)222
13.7.3Composite模式223
13.8参考资源223
第14章Half-sync/Half-async(半同步/半异步)模式224
14.1Half-sync/Half-async模式简介224
14.2Half-sync/Half-async模式的架构224
14.3Half-sync/Half-async模式实战案例解析226
14.4Half-sync/Half-async模式的评价与实现考量234
14.4.1队列积压235
14.4.2避免同步层处理过慢235
14.5Half-sync/Half-async模式的可复用实现代码236
14.6Java标准库实例240
14.7相关模式240
14.7.1Two-phaseTermination模式(第5章)240
14.7.2Producer-Consumer模式(第7章)241
14.7.3ActiveObject模式(第8章)241
14.7.4ThreadPool模式(第9章)241
14.8参考资源241
第15章模式语言242
15.1模式与模式间的联系242
15.2mmutableObject(不可变对象)模式244
15.3GuardedSuspension(保护性暂挂)模式244
15.4Two-phaseTermination(两阶段终止)模式245
15.5Promise(承诺)模式246
15.6Producer-Consumer(生产者/消费者)模式247
15.7ActiveObject(主动对象)模式248
15.8ThreadPool(线程池)模式249
15.9ThreadSpecificStorage(线程特有存储)模式250
15.10SerialThreadConfinement(串行线程封闭)模式251
15.11Master-Slave(主仆)模式252
15.12Pipeline(流水线)模式253
15.13Half-sync/Half-async(半同步/半异步)模式254
附录《Java多线程编程实战指南(设计模式篇)》常用UML图指南255
A.1UML简介255
A.2类图(ClassDiagram)256
A.1.1类的属性、方法和立体型(Stereotype)256
A.1.2类与类之间的关系258
A.3序列图(SequenceDiagram)261
参考文献263

前言/序言

随着现代CPU的生产工艺从提升CPU主频频率转向多核化,即在一块芯片上集成多个CPU内核(Core),以往那种靠CPU自身处理能力的提升所带来的软件计算性能提升的“免费午餐”不复存在。在此背景下,多线程编程在充分利用计算资源、提高软件服务质量方面扮演了越来越重要的角色。然而,多线程编程并非一个简单地使用多个线程进行编程的数量问题,其又有自身的问题。好比俗话说“一个和尚打水喝,两个和尚挑水喝,三个和尚没水喝”,简单地使用多个线程进行编程可能导致更加糟糕的计算效率。
设计模式相当于软件开发领域的“三十六计”,它为特定背景下反复出现的问题提供了一般性解决方案。多线程相关的设计模式为我们恰当地使用多线程进行编程并达到提升软件服务质量这一目的提供了指引和参考。当然,设计模式不是菜谱。即便是菜谱,我们也不能指望照着菜谱做就能做出一道美味可口的菜肴,但我们又不能因此而否认菜谱存在的价值。
可惜的是,国外与多线程编程相关的设计模式书籍多数采用C++作为描述语言,且书中所举的例子又多与应用开发人员的实际工作经历相去甚远。《Java多线程编程实战指南(设计模式篇)》作为国内第一本多线程编程相关设计模式的原创书籍,希望能够为Java开发者普及多线程相关的设计模式开一个头。
Java多线程编程实战指南(设计模式篇)》采用Java(JDK1.6)语言和UML(UnifiedModelingLanguage)为描述语言,并结合作者多年工作经历的相关实战案例,介绍了多线程环境下常用设计模式的来龙去脉:各个设计模式是什么样的及其典型的实际应用场景、实际应用时需要注意的相关事项以及各个模式的可复用代码实现。
Java多线程编程实战指南(设计模式篇)》第1章对多线程编程基础进行了回顾,虽然该章讲的是基础,但重点仍然是强调“实战”。所谓“温故而知新”,有一定多线程编程基础、经验的读者也不妨快速阅读一下本章,说不定有新的收获。
Java多线程编程实战指南(设计模式篇)》第3章到第14章逐一详细讲解了多线程编程相关的12个常用设计模式。针对每个设计模式,相应章节会从以下几个方面进行详细讲解。
模式简介。这部分简要介绍了相应设计模式的由来及核心思想,以便读者能够快速地对相应设计模式有个初步认识。
模式的架构。这部分会从静态(类及类与类之间的结构关系)和动态(类与类之间的交互)两个角度对相应设计模式进行详细讲解。模式架构分别使用UML类图(ClassDiagram)和序列图(SequenceDiagram)对模式的静态和动态两个方面进行描述。
实战案例解析。在相应设计模式架构的基础上,本部分会给出相关的实战案例并对其进行解析。不同于教科书式的范例,实战案例强调的是“实战”这一背景。因此实战案例解析中,我们会先提出实际案例中我们面临的实际问题,并在此基础上结合相应设计模式讲解相应设计模式是如何解决这些问题的。实战案例解析中我们会给出相关的Java代码,并讲解这些代码与相应设计模式的架构间的对应关系,以便读者进一步理解相应设计模式。为了便于读者进行实验,《Java多线程编程实战指南(设计模式篇)》给出的实战案例代码都力求做到可运行。实战案例解析有助于读者进一步理解相应的设计模式,并体验相应设计模式的应用场景。建议读者在阅读这部分时先关注重点,即实战案例中我们要解决哪些问题,相应设计模式又是如何解决这些问题的,以及实战案例的代码与相应设计模式的架构间的对应关系。而代码中其与设计模式非强相关的细节则可以稍后关注。
模式的评价与实现考量。这部分会对相应设计模式在实现和应用过程中需要注意的一些事项、问题进行讲解,并讨论应用相应设计模式所带来的好处及缺点。该节也会讨论相应设计模式的典型应用场景。
可复用实现代码。这部分给出相应设计模式的可复用实现代码。编写设计模式的可复用代码有助于读者进一步理解相应设计模式及其在实现和应用过程中需要注意的相关事项和问题,也便于读者在实际工作中应用相应设计模式。
Java标准库实例。考虑到Java标准库的API设计过程中已经应用了许多设计模式,《Java多线程编程实战指南(设计模式篇)》尽可能地给出相应设计模式在JavaAPI中的应用情况。
相关模式。设计模式不是孤立存在的,一个具体的设计模式往往和其他设计模式之间存在某些联系。这部分会描述相应设计模式与其他设计模式之间存在的关系。这当中可能涉及GOF的设计模式,这类设计模式并不在《Java多线程编程实战指南(设计模式篇)》的讨论范围之内。有需要的读者,请自行参考相关书籍。


其他推荐