Java并发编程:设计原则与模式 第二版.pdf

所需积分/C币:50 2018-12-07 16:22:37 46.68MB PDF
收藏 收藏
举报

自2Q世纪90年代以来,并发编程直是软件设计的热门话题。随着大型企业软件的演 化,以及Java与net的斗法并发编程的概念止被不断地强化其涵盖的内容也不断扩大, 在所有有关软件和编程的杂志和论文中亡几乎独占鳌头 由于Java语言在设计之初就考虑到了并发编程的因素,所以在和C ++的竞争中自占 了很大的优势。虽然JZEE规范了一些并发编程的底层设计使得开发人员可以更专注于业 务逻辑的实现但作为大型软件的开发人员或架构师对并发编程的理解和运用仍是必需的 而且可以说是永无止境的。 作为Java 15并发JsR的带头人Doug比a编写的这本《 Java并发编程设计原则与模 式》可以称为这方面的经典之作
开"大系列 Concurrent Programming in Java Design Principles and Patterns Second Edition Java并发编程 设计原则与模式 (第二版) [美] Doug Lea著 赵涌齐科科郑承豫郭明亮译 忄闰咆力出照社 Concurrent Programming in Java: Design Principles and Patterns Second Edition (ISBN0-201-31009-0) Doug lea Authorized translation from the English language edition, entitled Concurrent Programming in Java: Design Principles and Pattems Second Edition, published by Addison Wesley Longman, Inc, Copyright @2000 All rights reserved No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical luding photocopying, recording or by any information storage retrieval system, without permission from the Publisher CHINESE SIMPLIFIED language edition published by China Electric Power Press CopyrightC2003 本书由美国培生集团授权出版。 北京市版权局著作权合同登记号图字:01-20024844号 图书在版编目(CIP)数据 Java并发编程:设计原则与模式/(美)利著;赵涌等译.-2版.一北京:中国电力出版社,2003 ISBN75083-1828-5 1.J..II.①利.②赵,,ⅢJAⅥA语言一程序设计Ⅳ.TP312 中国版本图书馆CIP数据核字(2003)第108178号 书名:Jaa并发编程:设计原则与模式 编著:(美)道格·利 翻译:赵涌等 责任编辑:朱恩从 出版发行:中国电力出版社 地址:北京市三里河路6号邮政编码:100044 电话:(010)88515918传真:(010)88518169 印刷:汇鑫印务有限公司 开本:787×10921/6 印张:18 字数:417千字 书号:ISBN7-5083-1828-5 版次:2004年2月北京第1版 2004年2月第1次印刷 价:35.00元 版权所有翻印必究 译者序 自20世纪90年代以来,并发编程一直是软件设计的热门话题。随着大型企业软件的演 化,以及Java与net的斗法,并发编程的概念正被不断地强化,其涵盖的内容也不断扩大, 在所有有关软件和编程的杂志和论文中,它几乎独占鳖头。 由于Java语言在设计之初就考虑到了并发编程的因素,所以在和C++的竞争中,它占 了很大的优势。虽然J2EE规范了一些并发编程的底层设计,使得开发人员可以更专注于业 务逻辑的实现,但作为大型软件的开发人员或架构师,对并发编程的理解和运用仍是必需的, 而且可以说是永无止境的。 作为Java1.5并发JSR的带头人, Doug lea编写的这本巛Java并发编程:设计原则与模 式》可以称为这方面的经典之作。随着 util. concurrent包的广泛商用化,以及加入Java15标 准库的临近,潜在的读者数量正在倍增。虽然国外读者对这本书的深度和广度赞誉甚高,但 由于 Doug lea的严密论述而导致的语言相对深奥的问题也正日渐显露。因此,为了大家能更 好地理解本书所述内容,我们在翻译的时候尽量使用意译,将英文中复杂的句法尽量简化 翻译组的成员包括赵涌、齐科科、任文捷、关承豫和郭明亮等。具体负责的工作和个人 介绍如下: ◇赵涌,负责总体审稿和校对。具有多年的编程经验,从1998年开始由CC++编程 转为Jaⅵa编程,一直在电信领域编写和设计分布式应用软件。现在对Java服务器 端的模式和架构非常感兴趣。 ◆齐科科,负责第1章的翻译工作。是开源软件爱好者, blogger。兴趣方向:并行与 分布式计算。 ◇任文捷,负责第2章的翻译工作。2001年毕业于哈尔滨工业大学计算机系统结构 研究室,硕士学历,主要研究方向为 Linux操作系统健壮性分析。现在就职于联想 研究院,主要研究方向是语音识别、自然语言理解和人机交互界面等。 ◇关承豫,负责第3章的翻译工作。外资Java软件研发中心高级程序员,开源软件的 爱好者。研究方向:面向对象设计、设计模式、企业级软件设计和GU相关技术 ◇郭明亮,负责第4章的翻译工作。多年Java开发经验,具有丰富的实际项目经验, 参与过多个大型Java项目的开发与设计。目前兴趣:分布式计算。 本书由 JavaResearch org组织翻译和总体协调,我们还在 JavaResearch org的论坛中专门 开辟了“译作支持区”(htp/www.javaresearch.org/forum/forum.jsp?column=481),大家在阅 读本书过程中所遇到的任何问题或进发的任何感想都可以在那里发表,直接和译者及更多本 书的读者进行交流。有关本书的一些勘误,我们将在论坛中及时发布和更新。由于水平有限, 书中可能还存在着错误和不足,敬请读者朋友批评指正。 Java研究组织巛Java并发编程:设计原则与模式》翻译组 2003年10月 致谢 这本书开始于我在1995年春天编写的一小套Web页面。那时,作为实验性的开发阶段, 我试图把自己早期使用Java并发特性的尝试变得更有实际意义。在演变过程中,我首先在 World wide web上扩展、扩充以及删除了一些反映我和其他人有关JaⅤa并发编程的不断积 累的经验模式,-直到现在的成书,书中涵盖了有关并发软件开发的诸多方面的模式。至今, 那些网页还在,不过现在它只作为书中所阐述概念的补充材料。 在从页面到成书的过程中,许多有识之士给予了评注、建议、勘错报告以及意见交流 这些人包括: Ole Agesen、 Tatsuya Aoyagi、 Taranov Alexander、 Moti ben-Ari、 Peter buhr、 Bruce Chapman、I- Hyung Cho、 Colin Cooper、 Kelly davis、 Bruce eckel、 Yacov Eckel、 Saleh Mohamed、 Ed Falis、 Randy farmer、 Glenn goldstein、 David hanson、 Jyrki Heikkinen、 Alain Hsiung、 Jerry james、 Johannes johannsen、 Istvan Kiss、 Ross Knippel、 Bil Lewis、 Sheng Liang、 Jonathan Locke、 Steve macDonald、 Hidehiko masuhara、 Arnulf mester、 Mike mills、 Trevor Morris、 Bill Pugh、 Andrew Purshottan、 Simon roberts、 John rose、 Rodney Ryan、Joel Rosi- Schwartz、 Miles sabin、 Aamod sane、 Beverly Sanders、 Doug Schmidt、 Kevin shank、 Yukari shirota、 David Spitz、 David stoutamire、 Henry Story、 Sumana srinivasan、 Satish Subramanian、 Jeff Swartz、 Patrick Thompson、 Volker' Turau、 Dennis ulrich、 Cees vassar、 Bruce Wallace、 Greg wilson、 Grant Woodside、 Steve Yen、 Dave Yost,以及其他通过匿名电子邮件 发送评注的人们。 Ralph johnson模式研讨会的成员(尤其是 Brian foote和 Ian Chai)通读了一些模式的早 期形式,并提出了许多改进意见。纽约城模式组( New York City Patterns Group)的 Raj datta、 Sterling Barrett和 Philip eskelin,硅谷模式组( Silicon Valley Patterns Group)的 Russ rufer、 Ming kwok、 Mustafa Ozgen、 Edward anderson和 Don Chin对第二版的早期版本也做出了宝 贵贡献。 在时间很紧张的情况下,第一版和第二版书稿的止式和非正式的审阅人也都提出了有帮 助的意见和建议。他们是 Ken arnold、 Josh bloch、 Joseph Bowbeer、 Patrick Chan、 Gary Craig、 Desmond d’ Souza、 Bill Foote、 Tim harrison、 David henderson、 Tim lindholm、 Tom May、 Oscar nierstras乙、 James robins、 Greg Travis、 Mark wales、 Peter Welch和 Debora Zukowski。 需要特别感谢 Tom Cargill,他提出了很多见解和修正,而且容许在本书中阐述其特有的通知 模式( Specific Notification pattern)。此外,还要特别感谢 David holmes,除了其他贡献,他 还帮助开发和扩展了在第二版中所使用的教程的素材。 没有Sun实验室的慷慨支持,就不会有本书。我在这里要特别感谢 Jos marlowe和 Steve Heller,他们为我提供了在有趣而激动人心的研究开发项目中协同工作的机会。 最后,还要感谢 Kathy、Keih和 Colin为这一切所付出的忍耐。 Doug Lea,1999年9月 目录 译者序 致谢 第1章面向对象的并发编程 1.1使用并发构件 12对象和并发 世曾 IS 13设计因素 28 14 Before/ After模式 42 第2章独占……11111111111151 21不变性 …52 2,2同步….. 55 23限制 73 24构造和重构类 86 25使用锁工具.. …108 第3章状态依赖 31处理失败 l19 3.2受保护方法… 33类的构建与重构… 首t曾tt1君自世口 34使用并发控制工具类…1162 3.5协同操作.1 176 3.6事务处理 ……184 37工具类的实现 a.“ 195 第4章创建线程 208 m+++“!术博t十”黑 41单向消息 *4;““4 210 42编写单向消息…… 226 4.3线程中的服务( Services in thread)….….…...….241 44并行分解( Parallel Decomposition)….....255 4.5活动对象 274 第1章 面向对象的并发编程 本书讨论了一些可以在 Javalm编程语言中使用的思考、设计和实现并发程序的方法。本 书讨论的大多数内容都假定你是一个有经验的开发者,熟悉面向对象( object-oriented,OO) 编程,但是对于并发编程的知识了解得不多。当然,对于有着相反经历的读者,即熟悉其他 语言的并发编程,但是对Java语言中的相关部分知之甚少的读者,也可以从此书中得到不 少帮助。 本书粗分为四章(也许称为部分更为合适)。第1章,我们从对一些常用构件的简要介绍开 始,然后为并发的面向对象的编程建立一个概念基础:并发性是如何与对象结合起来的,设计 需求的结果是如何影响对象和组件的构造的,如何使用一些常用的设计模式来构建解决方案。 接下来的三章主要是围绕着如何使用(和避免)Java编程语言所提供的三种常用的并发 构件进行阐述的: 激占( Exclusion)。可以通过阻止多个并发行为间的有害干扰来维护对象状态的一致性。 通常使用同步( synchronized)的方法 状态依( State dependence)是否可以触发、阻止、延迟或是恢复某些行为是由一些对 象是否处在这些行为可能成功或是已经成功的状态上决定的。通常,状态依赖关系使用监视 器 monitor)方法实现,如 object.wait、 object, notify和 object, notify1l。 创建线程 Creating threads)使用线程( Thread)对象来创建和管理并发操作。 每章都包含一系列主要的节,而每一节又都有各自独立的士题。它们分别讲述了高级的 设计准则和策略,并发构件的技术细节,封装了常用方法的工具,以及用来解决特定并发问 题的设计模式等一系列问题。大多数节的结尾都附带了一份有关进阶阅读的文章列表,它们 包括了所讨论主题的更多信息。本书的线上支持包含了一些在线资料的链接,还有本书的更 新、勘误和代码示例。可以通过如下网址访问: http://java.suncom/series 或是 http://gee.cs.oswegoedu/d1/cp] 如果你已经熟悉了这些相关的基础知识,则可以按照章节的顺序深入学习每一个主题。 虽然大多数读者可能更希望根据各自不同的顺序学习本书,但是,出于多数有关并发的概念 和技术互相之间都是紧密关联的,因此很难完全独立地学习和理解某个单独的章节或是主 题。然而,你可以使用一种广度优先的方法,在开始对某个部分进行详细深入地学习之前, 第1章 先大致浏览一下每一章(包括本章)。在有选择地阅读某些材料之后,本书后面的很多内容 都可以通过与这些材料上附带的交义引用访问到 你可以现在就开始尝试着使用这一技巧,跳过如下的预备知识、 术语( Terminologyν)本书使用标准面向对象的术语约定:程序定义了方法(所实现的 操作)和成员变量(所表示的属性),这些变量保存了特定类的所有实例(对象) 面向对象程序中的交互通常与程序各个部分的职责相关。一个户( clien)对象通常期待 某个动作的执行,而一个务( server)对象通常包含着用来执行这个动作的代码。在这里, 术语客户和原务指的是它们的通常含义,而不是特指分布式的客户服务器结构。一个客户可 以是任何对象,它向另一个对象发送请求。而一个服务也可以是任何对象,它接受这个请求。 大多数对象都同时在扮演着客户和服务这两种角色。通常情况下,我们不必关心一个对象是客 户或者还是服务,或是同时属于这两种类型,它通常被称作一个主体host)而那些由它调用 的对象常常被称作是助对象( helper)或等体per同时,当讨论到如同obj.msg(arg) 形式的调用方式时,接受者(变量ob所代表的对象)则被称作月标 target)对象。 本书尽力避免讨论那些偶尔出现并且与并发操作没有直接关系的类和包,同时不涉及某 些特殊框架下的有关并发控制的技术细节,诸如 Enterprise JavaBeans和 Servlets。但有些 时候,它确实使用了一些与Java平台相关的商业软件和产品。 代码( Code listing)。本书包含了一系列看上去有些恼人的、短小但可运行的例子,通 过不断修改这些例子来说明书中涉及到的人多数技术和模式。这样做的目的是为了可以描述 得更清晰,而不是想让本书变得枯燥。如果使用其他的具体例子,这些并发构件可能会由于 过于细微而迷失在那些复杂的代码之中。通过重用相同的例子,并突出设计和实现方面的主 要问题,可以使得细小但关键的差别变得更加明显。同时,本书的内容还包括了简要的代码 和类的片断,描述了有关实现技术,但是它们也许并不完整甚至无法编译,这样的类都会在 代码清单一开始的注释部分中被指明。 有时代码中会省略一些 import语句、访问限定符,甚至某些方法和成员变量,这是因为 这些内容可以从上下文的关系中推断出来,或是不会对相应的功能产生影响。只要没有特殊 的理由去限定子类的访问, protected限定符就被用米作为那些非公有元素的默认属性 这保证了并发类设计的可扩展性(参见§1.34和§333)。默认情况下,类没有访问限定符。 有时,示例代码没有使用标准的格式,这样做的目的是为了使它们被安排在一页上或是突出 我们感兴趣的某些主要内容。 书中的所有例子的代码都可以从网上获得。书中的大多数技术和模式都用一个单独的代 码实例加以说明,其中给出了它们的典型形式和用法。线上支持还包括了额外的例子,用于 说明其他的一些细微变化,还有一些指向其他用法的链接。你还可以在网上找到一些史长的 例子,它们更适合浏览和测试,而不是作为代码阅读。 线上支持还包括了一个链接,指向一个有用的包uti1. concurrent,其中包括一些 书中讨论的实用类的产品级版本。这些代码运行在Java2平台上,并且在1.2x版本下进行 了测试。线上支持中还包括了一些零散的讨论、说明和脚注,简要地记载了从之前版本到现 有版本的修改,还有在写作本书时想到的、会在未来做出的修正,以及在实现时会遇到的 面向对象的并发编程 些奇怪但值得注意的问题。可以从在线支持中得到有关这些内容的最新数据 图例。我们使用标准的UML表示法来绘制交互图和类图(可以参考§11.3的进一步说 明)。本页的表示法图(经 Martin fowler允许)演示了图例在本书中的样子。除此之外,我 们没有使用其他的UML表示法、方法和术语。 个对象 交互图 创建 寸象 新建对 消息(发送消息) 调用白身 返回 时间 类名 多个(零或多个 Cla 可选(零或一个 类名 属性[:类型=初始值 Class C 聚合 操作[(参数列表)返回类型 变量或规则的名字 操作 (操作 注释 <<Interface>> 些有用的文字 接口 和简单的代码 超类 实现类 子类1 子类2 其他的大多数图例用来描绘线程时序关系( timethread),那些随意绘制的灰色曲线用来 跟踪线程调用多个对象的轨迹。扁平的箭头表示阻塞。椭圆形的物体表示对象,有时当中也 包含了一些有关内部特性的说明,比如锁、成员变量和一部分代码。在对象中间的那些细的 线条(有时标以说明)指明了对象间的关系(通常是引用,或是潜在的调用关系)。下图使 用了一个并无实际意义的例子来说明线程A已经取得了对象X上的锁,因而正在执行对象

...展开详情
试读 127P Java并发编程:设计原则与模式 第二版.pdf
立即下载 低至0.43元/次 身份认证VIP会员低至7折
    一个资源只可评论一次,评论内容不能少于5个字
    金木梓 非常棒的一本书
    2020-03-09
    回复
    关注 私信 TA的资源
    上传资源赚积分,得勋章
    最新推荐
    Java并发编程:设计原则与模式 第二版.pdf 50积分/C币 立即下载
    1/127
    Java并发编程:设计原则与模式 第二版.pdf第1页
    Java并发编程:设计原则与模式 第二版.pdf第2页
    Java并发编程:设计原则与模式 第二版.pdf第3页
    Java并发编程:设计原则与模式 第二版.pdf第4页
    Java并发编程:设计原则与模式 第二版.pdf第5页
    Java并发编程:设计原则与模式 第二版.pdf第6页
    Java并发编程:设计原则与模式 第二版.pdf第7页
    Java并发编程:设计原则与模式 第二版.pdf第8页
    Java并发编程:设计原则与模式 第二版.pdf第9页
    Java并发编程:设计原则与模式 第二版.pdf第10页
    Java并发编程:设计原则与模式 第二版.pdf第11页
    Java并发编程:设计原则与模式 第二版.pdf第12页
    Java并发编程:设计原则与模式 第二版.pdf第13页
    Java并发编程:设计原则与模式 第二版.pdf第14页
    Java并发编程:设计原则与模式 第二版.pdf第15页
    Java并发编程:设计原则与模式 第二版.pdf第16页
    Java并发编程:设计原则与模式 第二版.pdf第17页
    Java并发编程:设计原则与模式 第二版.pdf第18页
    Java并发编程:设计原则与模式 第二版.pdf第19页
    Java并发编程:设计原则与模式 第二版.pdf第20页

    试读已结束,剩余107页未读...

    50积分/C币 立即下载 >