本书全面介绍了如何使用java 2平台进行并发编程,较上一版新增和扩展的内容包括:·存储模型 ·取消 ·可移植的并行编程 ·实现并发控制的工具类java平台提供了一套广泛而功能强大的api,工具和技术。内建支持线程是它的一个强大的功能。这一功能为使用java编程语言的程序员提供了解并发编程这一诱人但同时也非常具有挑战性的选择。本书通过帮助读者理解有关并发编程的模式及其利弊,向读者展示了如何更精确地使用java平台的线程模型。这里,读者将通过使用java.lang.thread类、synchronized和volatile关键字,以及wait、notify和 notifyall方法,学习开x大Concurrent Programming in JavaDesign Principles and Patterns Second EditionJava并发编程设计原则与模式(第二版)[美1 Doug L9a著赵涌齐科科郑承豫郭明亮译忄闵电力归照社Concurrent Programming in Java: Design Principles and Patterns Second Edition (ISBn0-201-31009-0)Doug lcaAuthorized translation from the English language edition, entitled Concurrent Programming inJava: Design Principles and Pattems Second Edition, published by Addison Wesley longman, IncCopyrightc2000All rights reservedNo pail of this book may be reproduced or transmitted ir: any form or by any means, electronic or mechanicalincluding photocopying, recording ar by any information storage retrieval system, without permission from thePublisherCHINESE SIMPLIFIED language edition published by China Electrie Power Prcss Copyright@2003本书由美图培集团授权出版北京市版权局著仵权合同登记号图字;0:-20024844号图书冇版编∏《C|〉数据Java并发編释:设训燉则与模式/(关}利著:是涌等.—2版,一北京:中国也力出成社,2003IsBN7-5D83-1828-5.利2赵而AWA语言一科序设让ⅣV.TP32闪版木图馆¢]P数据核(2093)第108178名:Java并发编稈:设计总则与蟆式编著;(美)道烙·利翻评:赵涌等聂任编辑:朱恣以出版发行:屮电月出版针地址:北京市二竺河路6号邮政编码:100044电话;(010)88159:8传具:(010)885」8169印:汇鑫印务有限公司开本:787X1092116E]张;18宁数:217千字书号;ISBN7-5083-18285版次∵;204年2北京第1版204饣2月第】次印成定价:3590元版权所有翻印必究译者序自20世纪90年代以来,并发编程一直是软件设计的热门话题。随着大型企业软件的演化,以及Ja阻与net的斗法,并发编程的概念止被不断地强化,其涵盖的内容也不断扩大在所有有关软件和编程的杂志和论文中,它几乎独占鳌头由于Jaa语言在设计之初就考虑到了并发编程的因素,所以在和C++的竞争中,它占了很大的优势。虽然]EE规范了一些开发编程的底层设计,使得开发人员可以更专注于业务逻辑的实现,但作为大型软件的开发人员或架枸师,对并发编程的理解和运用仍是必需的而且可以说是水无止境的作为Java1.5并发JSR的带头人, Doue lea编写的这本幻Java并发编枏:设计原则与模式》可以称为这方面的经典之作。随着util! concutrent包的广泛商用化,以及加入』ava15砾准库的临近,濬在的读者数量正在倍增。虽然国外读者对这本书的深度和广度赞誉贰高,但由」 Doug leia的严密论述而导致的语言相对深奥的问题也正囗渐显露。因此,为了大家能更好地理解本书所述内容,我们在翻译的时候尽量使用意译,将英文中复杂的句法尽量简化翻译组的成员包括赵涌、齐科科、仼文捷、关承豫和郭明亮等。具体负责的工作和个人介绍如卜◇赵潏,负責总休审稿和校对。具有多年的编程经验,从1998年开始由CC++编程转为Jaa编程,一直在电信领坝编写和设计分布式应用软件。现在对]aⅦa服务器端的模式和架构非常感兴趣。◆齐科科,负责第1章的翻译T作。是廾源软件爱好者, blogger兴越方向:并行与分行式计算。◇任文捷,负责第2章的翻译工作。2001年毕业于哈尔滨工业大学计算机系统结构硏究室,硕士学历,主要研究方向为 Linux操作系统健壮性分析。现在就职于联想矿究院,主要研究方向是语音识别、自然语言理解和人机交互界面等关承豫,负责第3章的翻译工作。外资Java软件研发中心高级程序员,开源软件的爱好者。研究方向:面向对象设计、设讦模式、企业级软件设计和GU相关技术。☆郭明亮,负责第4章的翻譟工作。多年Java开发经验,具有丰富的实阪项目经验参与过多个大型Java项目的开发与设计。目前以趣:分布式计算本书由 Javaresearch org组织翻译和总体协调,我们还在 JavaResearch org的论坛中专门开牌了“译作支持区”(htp: ww. javaresearch org/forum/forum.jsp? column=481),大家在阅读本书过程中所遇到的任何问题或进发的任何感想都可以在那里发表,直接和译者及更多本书的读看进行交流。有关本书的一些謝误,我们将在论坛中及时发布和更新。由于水平有限,书中可能还存在着错误和不足,敬请读者朋友批评指止。Jaⅵa研究组织巛ava并发编程:设计原則与模式》翻译组2003年10月致谢这本|开始于我在195春天编写的一小套Web页面。那H,作为实验性的开发阶段我试图把自己早期使井Java并发特性的尝证变得史有实总义。在演变过程中,我首先在World wide web上扩展、扩充以及删除了一些反玦我和其他人有关Java并发编程的不断积累的绎验模式,一直到现在的成书,书中涵盖了有关并发软件开发的诸多方而的模式。至今那些网页还在,不过现在它只作为中所阐述概念的补充材料。在从页面到成书的过程中,许多冇识之士给予了评注、建议、勘错报告以及意见交流这些人包括: Ole Agesen、 Tatsuya Aoyagi、 Taranov Alexander、 Moti Ben-ari、 Peter buhrBruce Chapman、 Il-Hyung Cho、 Colin Cooper、 Kelly Davis、 Bruce eckel- Yacon Eckel、 salehMohamed、 Ed falis、 Randy farmer、 Glenn goldstein、 David hanson、 Jyrki Heikkinen、 AlainHsiung← Jerry James、 Johannes johannsen、 Istvan Kiss、 Ross Knippel、 Bil lewis、 Sheng liang、Jonathan locke, steve macDonald hidehiko masuhara Arnulf mester Mike mills trevorMari!s、 Bill Pugh、 Andrew purshottam、 Siman roberts、 John rose、 Rodney Ryan、JoelRosi-schwartz、 Miles sabin、 Aamed sane、 Beverly sanders、 Doug schmidt、 Kevin shank、Yukari shirota、 David spitr、 David stoutamire、 Henry story、 Sumana srinivasan、 SatishSubramanian、 Jeff swartz、 Patrick Thompson、 olker turay、 Dennis ulrich, Cees hissar、Bncewallace、〔 ireg Wilson、〔 rant woodside、 Steve yen、 Dave yost,以及其他通过匿名电了邮件发送评注的人们Ralph Johnson模式研讨会的成员(元其是 Brian Foote和 Tan chai)通读了一些模式的早期形式,并提出了许多改进意见。纽约城模式组( New York City Patterns Group)的 Raj DattaSterling barrett和 Philip eskelin,砗谷模式练( Silicon valley Patterns Group)的 Russ ruferMing 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 MayOscar nierstrasz、 James robins、 Greg Travis Mark wales、 Peter Welch和 Debora Zukowski。需要特别感谢 Tom Cargi,他提出了很多见解和修王,而且容许在本其中阐述其特有的通知模式( Spccific Notification patterm)。此外,还要特别感谢 Dayid holmes,哙了其他贡献,他还帮助开发和扩展了在第二版中所使用的教程的素材。没有Su实验室的慷慨支持,就不会有本书。我在这里要特别感谢 Jos marlowe和 steveHeller,他们为我提供了在有趣币激动人心的研究开发项中协同工作的机会最后,还要感谢Kay、Kei和coin为这一切所付出的忍时Doug lea,1999年9月目录译者序致谢第1章面向对象的并发编程■ dnn卜卜4b■晶■l使用并发构件42对象和并发…153设计素284 Before/ Afier模式…42第2章独占1口■自tt『■t目1自音‘■1t血虚■斷■會■山■‘山『■卜■t■血■會音山■dT2!不变性22同步…■暴七■日b523限制3■■·幽■■■口鲁;■■t上加山d血■亡t■24构造和重构类2.5仗用锁,具…108第3章状态依赖31处理败L1932受保护方法■■』■山1323类的构建与重构∴14834使用并发控制匚具类1623.5协同燥作p看曲■自幽■p血日山d鲁■由b幽l7636事务处理…1843.7工具类的实现l95第4章创建线程2084.1单向消总21042编写单向消息2264,3线程中的服务 Services in' Thread),+2144并行分解( Parallel decomposition),25545活动对象■山番■鲁bm■d■274第1章面向对象的并发编程本书讨论了一些可以在avaM编程语言中使用的思考、设计和实现并发程序的方法。本书讨论的大多数内容都假定你是一个有经验的开发者,热悉面向对象(obet- oriented,OO编程,但是对于并发编程的知识了解得不多。当然,对丁有着相反经历的读者,即熟悉其他语言的并发编程,但是对Java语言中的相关部分知之甚少的读考,也可以从此书中得到不少帮助本书粗分为四章(也许称为部分更为合适)第1章,我们从刈-出常厍构件的简要介绍开始,然后为并发的面向对象的编程建立一个概念基健:并发性是如利与对象结合起来的,设计需求的结果是如何影响对象和组什的构造的,如何使用些常用的设计模式米构建解决方案。接下来的三章主要是围绕着如何使用(和避免)JaⅦa编程语言所提供的三种常用的并发构件进行阐述的占( Exclusion)。可以通过阻止多个并发行为间有害干扰来维护对象状念一致性。通常使用同步(5 ynchroni zed)的方法状态依毅( State dependence)。是否可以触发、阻止、延迟或是恢复某些行为是出…些对象是否处在这些行为可能成功或是已经成功的状态上决定的。通常,状态依赖关系使用盥视翮( monitor)方法实现,如 object,wait、 object. notify和 object, notify11。创建线程 rating threads)使用线程( Thread)对象来创建和管猁并发操作每章都包含一系列上要的节,m每一节又都有各自独立的王题。它们分别讲述了高级的设计准测和策略,并发构件的技术细节,封装了常用方法的工具,以及用米解决特定并发问题的设计模式等一系问题。大多数节的结尾都附带了一份有关进阶阅读的文章列表,它们括了所讨论主题的更多信息。本书的线上支持包含了一些在线资料予链接,还有本书的更新、射误和代码示例。可以通过如卜网址访习http://java.suncom/series或是http://gee.Cs.oswego.eduydl/cpj如果你已经熟悉了这些相关的基础知识,则可以按照章节的顺序深入学丬每一个主题虽然大多数读者叫能更希望根据各自不同的顺序学习本书,但是,山于多数有关广发的概念和技术上椭之间都是紧关联的,因此很难完全独立地学和理某个单独的章节或是主题。然而,你可以使用一种广度优先的方法,在开始对某个部分进行详绷深入地学习之前,第1音先人致浏览一下每-(包括本章)。在有迭择地阅读某些材*之后,本书后面的很多内容绍可以通过与这些材料上附带的交义引用访问到你可以现在就开始尝试着使用这一技巧,跳过如下的预备知以。术语( Terinulugy本书使用标准面向对象的术语约定:程序定义了方(所实现的撅作)和成员变量(所瑟示的,这些变量保存了特定类的所有实(对象)面向对象程序中的交E通常与程序各个部分的职责相关。一个客户(clnt)对象通常期待某个动作的执行,而一个服务〔 serer)对象通常包含着用来执行这个动伫的代码。在这里,术谲寥户和鹽多指的是它们的通常含义,而不是特指分布式的户服务器结构。个客户可以是任何对象,它向另一个对象发送请求。而一个服务也可以是任何对象,它接受这个请求大多数对象都问时在扮演着客户和服务这网种角色。通常情况下,我们不必关心一个对象是客户或考还是服务,或是同时属于这两种类型,它通常被称作一个主体ho)而那些主它调用的对象常常被称作是输勋段( helper)或对等体er)同时,当讨论到如同 abj. msg〔arg)形式的调用方式时,接受者(变量obj所代表的对象)则被称作月标( target)对象本|尽力避兔讨论那些偶尔出现并且与并发操作没有直接关系的类和包,同时不涉及某些特姝框架下的有关并发控刽的技术细节,运如 Enterprise JavaBeans和 Servlets.但有些时候,它确实使用了一些与Java半台相关的商业软件和产品代码( ode listing)。↑书包含了一系列看上去些怖人的、短小但可运行的恻子:通过不断修改这些例子来说明书中涉及到的大多数技术和模式。这样做的目的是为了可以带述得更清晰,而不是想让本书变得枯燥。如果使用其他的具体例子,这些并发构件川能会中干过于细微而迷失在那些复余的代码之1。通过重用相同的例子,共突出设计和实坳方面的主要问题,可以使得细小佀关键的差别变得史加明显,同时,本书的内容还包括了简要的代码和类的片断,排述了有关实现投术.但是它们也许并不完整甚全无法编详,这样的类都会在代码清单一严始的注释部分中被指明有时代码中会省略一些 mport语句、访问限定符,甚至某些方法和成员变量,这是因为这些内容可以从卜下文的关系中推断出来或是不会对相应的功能产牛影响。具要没有特殊的理由去限定子类的访何, protected限定符就被用米作为那些非公有元素的默认属性这侏i∫并发类设计的可扩展性(参见§13.4和§3,3)。默认情况下,类没有访问限定符有时,示例代码没有使用标准的格式,这样做的日的是为了使们被安排在一页上或是突出我们感兴趣的某些主要内容书屮的所有例子的代码都叫以从网上获得。书中的大多数拉术和模式都用一个单独的代码实例加以说明,其十给出了它们的典型形式和用法线}支持还包括了额外的例子,用于说明其他的一些细微变化,还有些指向其他用法的链接你还可以在网上找到些定长的例子,它们更适合浏览和测试,而不是伫为代码阅读线上支持还包括∫一个链接,指向一个有用的包uti1 concurrent,其中包括一些书中讨论的实用类的产品级版本。这些代码运行在J2平台,并且在12x版本卜进行了测试。线上支持中还包括了些零散的讨论、说明和脚注,简要地记载了从之前版本到现行版本的修改.还有在写作本书时想到的、会在未来做出的修正,以故在实现时会遇到的面向对象的并发编程些奇怿佀值得注意的问题。可以从存线支持中得到有关这些内容的最新数据矧剑。我们使用标准的CML表示法来绘制交互图和类图(可以参考§113的进一步说明)。本页的六法型(经 Martin fowler允许)演小了图例在本书中的样子。除此之外,我们没有使用其他的UML表示法、方法和术语。一个对象交互图创建新建对象消息(发送消调用白的方法返问时间类名Cass多个(零或多个)0.1s可选(零或一个〕类名属性[:类型=初始值℃]ass聚合操作L(数数表:返同类型变量刺的名字操作源(标注释一此石用的文字接口和简单旳码超类实现类」类子类2其他的大多数图例用来描绘线积时序关系 timethread),那些随意绘制的灰色曲线用来跟踪线程调用多个对象的轨迹。扁平的箭头表示阻塞。椭园形的物体表示对象,有时当中也包含了一些有关内部將性的说明,比如锁、成员变量和一部分代码。在对象中间的那些细的线条(有时栎以说明)指明了对象间的关系(通常是引用,或是潜在的调用关系)下图仗用了一个并无实际意义的例子来说明线程A匚经取得了对象X上的锁,因而正在执行对象3