JAVA并发编程实践 Java Concurrency in Practice 有更新!

  Bob

基本信息

  • 原书名:Java Concurrency in Practice
  • 原出版社: Addison-Wesley Professional
  • 作者: (美)Brian Goetz    Tim Peierls    Joshua Bloch    Joseph Bowbeer    David Holmes    Doug Lea   
  • 译者: 韩锴 方妙
  • 出版社:电子工业出版社
  • ISBN:9787121043161
  • 上架时间:2007-7-11
  • 出版日期:2007 年6月
  • 开本:16开
  • 页码:403
  • 版次:1-1
  • 所属分类:
    计算机 > 软件与程序设计 > JAVA(J#) > 综合
     

编辑推荐

获得16届 Jolt大奖提名!
2006 JavaOne大会最畅销图书!
对并发、多线程的最佳阐述!
Java 并发编程图书中最值得一读的力作!
让您沉着、踏实地迈进并发/多核时代!

内容简介

    书籍
    计算机书籍
随着多核处理器的普及,使用并发成为构建高性能应用程序的关键。Java 5以及6在开发并发程序取得了显著的进步,提高了Java虚拟机的性能,提高了并发类的可伸缩性,并加入了丰富的新并发构建块。在本书中,这些便利工具的创造者不仅解释了它们究竟如何工作、如何使用,同时,还阐释了创造它们的原因,及其背后的设计模式。 本书既能够成为读者的理论支持,又可以作为构建可靠的,可伸缩的,可维护的并发程序的技术支持。本书并不仅仅提供并发API的清单及其机制,本书还提供了设计原则,模式和思想模型,使我们能够更好地构建正确的,性能良好的并发程序。
本书的读者是那些具有一定Java编程经验的程序员、希望了解Java SE 5,6在线程技术上的改进和新特性的程序员,以及Java和并发编程的爱好者。

作译者

本书作者系lava标准化组织(Java Cotl]munity Process)JSR 166专家组(并发工具)的主要成员,同时他们还致力于其他多个JCP专家组织。Brain Goetz是一位拥有二十年行业经验的软件咨询师,发表过超过75篇关于。Java开发的文章。Tim Peierls是现代多处理器的权威,在BoxPop.biz、唱片艺术和戏剧表演上也造诣颇深。Joseph Bowbeer是一位Java ME专家,他对并发编程的痴迷始于在Apollo计算机上编程的岁月。David Holmes是《The Java TM Programmjng LangLJage》的合著者,目前就职于Sun Microsysterns。Joshua Bloch是Google的首席Java架构师,《Effective Java》的作者、《3ava PLizzlers》的合著者,他不像他的兄弟(his brother,Bloctl与Neal主持的Java编程专栏里虚构的人物)那样编程,从来都不。Doug Lea是《Corlcurrent Progra r11ming in Java》的作者,SUNY Oswego大学计算机科学的教授。 

目录

代码清单

第1章 介绍
1.1 并发的(非常)简短历史
1.2 线程的优点
1.3 线程的风险
1.4 线程无处不在
第1部分 基础
第2章 线程安全
2.1 什么是线程安全性
2.2 原子性
2.3 锁
2.4 用锁来保护状态
2.5 活跃度与性能
第3章 共享对象
3.1 可见性
3.2 发布和逸出
3.3 线程封闭
3.4 不可变性
3.5 安全发布
第4章 组合对象
4.1 设计线程安全的类
4.2 实例限制
4.3 委托线程安全
4.4 向已有的线程安全类添加功能
4.5 同步策略的文档化
第5章 构建块
5.1 同步容器
5.2 发容器
5.3 阻塞队列和生产者一消费者模式
5.4 阻塞和可中断的方法
5.5 Synchronizer
5.6 为计算结果建立高效、可伸缩的高速缓存
第2部分 构建并发应用程序
第6章 任务执行
6.1 在线程中执行任务
6.2 Executor 框架
6.3 寻找可强化的并行性
第7章 取消和关闭
7.1 任务取消
7.2 停止基于线程的服务
7.3 处理反常的线程终止
7.4 JVM关闭
第8章 应用线程池
8.1 任务与执行策略问的隐性耦合
8.2 定制线程池的大小
8.3 配置ThreadPoolExecutor
8.4 扩展ThreadPoolExecutor
8.5 并行递归算法
第9章 GUI应用程序
9.1 为什么GUI是单线程化的
9.2 短期的GUI任务
9.3 耗时GUI任务
9.4 共享数据模型
9.5 其他形式的单线程子系统
第3部分 活跃度,性能和测试
第10章 避免活跃度危险
第11章 性能和可伸缩性
第12章 测试并发程序
第4部分 高级主题
第13章 显示锁
第14章 构建自定义的同步工具
第15章 原子变量与非阻塞同步机制
第16章 Java存储模型
附录A 同步Annotation
参考文献
索引 
 

译者序

  随着译稿最后一个字符的键入,我长舒一口气,目光不知不觉中落到了我的新笔记本电脑上,上面赫然贴着某处理器厂商新推出的多核处理器的Logo。几个月来不断地与并发打交道,让我深深地感受到,我们已经进入了一个全新的时代——多核时代。. 
  回想十几年前,提起多处理器或者多核系统,人们总会想到被摆放到实验室中发着轰鸣响声的机器,它们通常体型庞大,而且价格不菲,很多程序员对它们都是顶礼膜拜,又有多少人能为它们编写程序呢?在很多程序员心中,“并发”也已经成为了“高深”的代名词。 
  造成这种现象的原因有两点。其一,在很多人心中,编写“并发”程序相对于编写“串行”程序更加困难。“并发专家”也因此被笼罩了一层神秘的面纱。其二,没有“需求”。多余的并发性在单处理器系统上显得有些力不从心。程序员的懒惰让他们很少有时间去编写没有人需要的代码。几年前,大量客户端代码都是运行在单处理器环境中的。在这种情况下,如果产生多个线程完成同一件事(比如压缩文件),效率只能随着线程生命周期管理与上下文切换而降低。 
  然而今天,多核已经成为不可阻挡的历史潮流了。计算机在人们的生产生活中发挥着越来越重要的作用。无论是科学计算、商业系统还是个人桌面应用,对性能的要求始终在增长。另一方面,流行四十年之久的“摩尔定律”已渐渐显露疲态,电子电路的物理极限是无法突破的。在这样的环境下,“多核”应运而生。在一块芯片上嵌入更多的处理单元,相对于复杂昂贵的多核系统,是提升系统并行性与性能的简单、经济的途径,它更容易被普通大众所接受与使用。如果你正在准备或者刚刚购买新的个人电脑,你注意到它的处理器中包含了多少个内核了吗? 
  多核的影响是广泛且深入的。企业需要改变以往基于CPU数的计价方式。系统设计者需要重新审视多核产生的并行性带来的影响。一线的开发人员要学习新的开发思路、技巧和工具。并行的理念需要融入到系统的设计与实现的过程中。对程序员来说,多核带来的变化并不像时钟频率增加那样透明。以前我们已经对软件加入了很多的期望,比如可扩展性、健壮性、可伸缩性、可测试性等等,今天我们还要考虑软件是否充分发挥了微处理器的全部性能。只有充分挖掘程序的并行性,才能让多核处理器物尽其用,才能让你的软件在今后内核不断增加的日子里,得以保持升级。.. 
  面对这些挑战,不禁令人有些担心。好在现代先进的运行时环境和编译器都对并行做好了大量的优化准备。更难得的是,像Java这样的高级语言提供了对并发的语言级支持。这个特性正是Java的伟大创新之一。尤其是Java 5的发布,更是Java并发开发的质的飞跃。若干年前必须依靠本机代码才能实现的功能,如今可以使用纯Java代码实现;若干年前只有并发专家才能开发的程序,如今你也可以编写出来;若干年前极易产生bug的功能模块,如今可以使用Java核心类轻松实现。而Brian的这本书就是帮你做到这一点的最佳指南。Brian以其特有的师者风范,以精准而不失诙谐的文字,将Java并发开发的奥秘抽丝剥茧,让读者在享受阅读乐趣的同时,获得广博而深入的并发知识和技能。这些足以帮助开发者消除(减轻)多核时代的“危机”。 
  如果是孤军奋战,很难想象可以完成这部著作的翻译,期间我们得到了太多的帮助,即使挂一漏万,也要尽力列在这里: 
  首先要感谢本书的原作者Brian Goetz先生。如果没有他的付出,就谈不上这个译本的出现。还要感谢他不厌其烦地回答了我们大量的问题。Brian每次平易近人和极为认真的回复,都让我们在提高译本质量的过程中受益匪浅。 
  法律专业出身的原莹小姐,感谢你以极大的勇气,踏入这个对你来说并不熟悉的领域。得益于你的辛劳,这本书的文字才会摆脱一些计算机科学的冰冷。 
  感谢博文视点的各位老师和编辑,尤其是晓菲。你们的敬业与认真,深深地感动了我。 
  感谢中国人民银行软件开发中心的各位同事,是你们的宽容,让我有更多的时间投入到这本书的翻译工作中。 
  最后,也是最重要的,感谢这本书的另一位合译者——方妙小姐。你的专业知识和文字功底让我惊叹。与你的合作是一段令人愉快且难忘的经历。 
  …… 
  计算机领域从来都不乏变革,每一次都带来新的机遇与挑战。“多核”无疑是一场令人激动的变革。迎接技术变革与挑战,是软件开发者的空气和水。很高兴你已经读到了这里,那么请不要停下来,继续享受挑战的乐趣,继续面对这场变革,前进吧!... 
  韩锴 
  2007年3月于北京 
  

序言

  在汗牛充栋的 Java 图书堆中,关于并发性的书籍却相当稀少,然而这本书的出现,将极大地弥补了这一方面的空缺。即使并发性编程还没进入到您的 Java 日常开发当中来,也应当花些时间来阅读这本重要的图书。该书是由 developerWorks 《Java 理论与实践》http://www.ibm.com/developerworks/cn/java/j-jtp/专刊的作者Brian Goetz (http://www.briangoetz.com/) 执笔,他曾是Quiotix 软件开发和咨询公司的首席顾问Sun Microsystems 的高级工程师,现在是,并且效力于多个 JCP 专家组。他作为专业的软件开发人员已经有 20 年了,其在 Java 并发性领域的研究与贡献是有目共睹的。. 
  这是一本目前在 Java 并发性领域研究的编程图书中最值得一读的力作。随着计算机技术的不断迅速发展,各种各样的编程模型也越来越多,越来越复杂化与多样化。虽然当前CPU主频在不断升高,但是X86架构的硬件已经成为瓶颈,这种架构的CPU主频最高为4G,事实上目前3.6G主频的CPU已经接近顶峰,多线程编程模型不仅是目前提高应用性能的手段,更是下一代编程模型的核心思想。它的目的就是“最大限度地利用CPU资源”,当某一线程的处理不需要占用CPU而只需要I/O等其他资源时,就可以让需要占用CPU资源的其他线程有机会获得CPU资源。因此,就目前来说,多线程编程模型仍是计算机系统架构的最有效的编程模型。 
  Java 提供了语言级的多线程支持,所以在 Java 中使用多线程相对于在 C/C++ 当中使用多线程来说更加简单与快捷。除了 Brian Goetz 自己的研究、经验和热心读者的贡献之外,本书还吸取了一些并发性前沿人员的真知灼见,包括 Tim Peierls、Joshua Bloch、Joseph Bowbeer、David Holmes 和 Doug Lea。在该书中, Brian Goetz 从最基本的知识开始介绍,首先集中描述了在 Java 平台上创建线程应用程序以及同步对共享资源的访问时的细微之处;然后分析了 Java SE 5 提供的更高层次的线程执行构造,以及如何最好地把它们应用到现实世界中的不同场景,并整合了一些最佳实践和最新的研究主张;再就现实中的生存保证、性能、可伸缩性和可测试性的困难问题进行了分析,并把当前的最佳实践调查与相关的研究结果相结合,提供了一些可行的替代方案;最后介绍了一些在开发中可能适用的高级并发性技术,包括显式锁、定制同步器、原子变量与非阻塞同步,还介绍了低级的 Java存储模型。同时,在全书贯穿了许多简洁的代码示例,用来演示问题和可行的解决方案。 
  当我们从今天以应用程序为核心的开发平台转移到不远的未来支持多核处理器的操作系统和平台机制时,Java Concurrency in Practice 代表了这个容易出错的领域当前最新的并发性实践和研究。相信这一本优秀的图书将是您案头的必备书籍,强烈建议您阅读并实践之。 
  愈黎敏 
  2007年3月于上海 
   
  写作本书时,出于桌面系统的迫切需求,多核处理器正在变得越来越便宜。与此不协调的是,很多开发团队还没有注意到,在他们的项目中,出现了越来越多的关于线程的错误报告。在NetBeans开发者站点上最近的一次通告中,一位核心维护者注意到,为了修复某个类的一个线程相关的问题,已经被打了14次补丁。Dion Almaer,前TheServerSide的编辑(经过一次痛苦的调试过程,最终发现是一个线程的Bug之后),最近在Blog上写道,大多数Java程序都充斥着并发Bug,它们仅仅是“碰巧”可以工作。 
  的确,由于并发性的Bug不会以可预见的方式自己“蹦”出来,因此多线程程序的开发、测试和调试都会变得极端困难。Bug浮出水面的时刻,通常可能是最坏的时候——对应于生产环境,就是指在高负载的时候。 
  使用Java开发并发程序所要面对的挑战之一,是要面对平台提供的各种并发特性之间的不匹配,还有就是程序员在他们的程序中需要如何思考并发性。语言提供了一些低层机制,比如同步和条件等待,但是这些机制在实现应用级的协议与策略时才是必须的。不顾这些策略的约束,很容易创建出一个程序,它在编译和运行时看上去一切正常,不过却存在隐患。很多并发方面相当不错的书都没能达到预期的目标,它们过分关注于低层的机制和API,而不是设计层面的策略和模式。 
  Java 5.0是在使用Java开发并发应用程序的进程中,迈出的巨大一步。它提供了新的高层组件以及更多的低层机制,这些将使得一名新手更容易像专家那样去构建并发应用程序。本书的作者都是JCP专家组的主要成员,正是这个专家组创建了这些新工具;除了去描述新工具的行为和特性,我们还向您展示了它们低层的设计模式,预期的使用场景以及将它们纳入平台核心库的动机。 
  我们的目标是给读者一些设计法则和理念模型,让读者在使用Java构建正确、高效的并发类和应用程序时,变得更容易——更有趣。 
  我们希望你在阅读《Java并发编程实践》的过程中能够获得愉悦感。 
  Brian Goetz .. 
  2006年3月于Williston, VT 
  如何使用本书 
  Java低层机制与设计层必要的策略之间存在着抽象的不匹配。为了解决这个问题,我们呈现了一个经过简化的规则集,用来编写并发程序。专家们看到这些规则会说:“嗨,这可不是完整的规则,类C即使破坏了规则R,它仍然可以是线程安全的。”尽管打破我们的规则,也可能写出正确的并发程序,不过这样做需要对Java存储模型的低层细节有着深入的理解。我们的愿望是:开发者不用熟悉这些细节,就有能力编写正确的并发程序。只要坚持遵守我们简单的规则,就能编写出正确的、可维护的并发程序。 
  我们假设读者已经具备了对Java基本并发机制的一些了解。《Java并发编程实践》不是并发的入门指南——关于这个,可以参看任何正统的介绍性的大部头书籍,比如《Java编程语言》(Arnold et al., 2005)。本书也不是关于并发的百科全书似的参考手册——关于这个,可以参看《Java并发编程(Lea, 2000)》。对本书更恰当的描述是,它提供了实际的设计规则,可以协助开发者,他们正在处于创建安全的、高效的并发类这一艰难的过程中。在适当的地方,我们穿插引用了下列图书的章节:《The Java Programming Language》、《Concurrent Programming in Java》、《The Java Language Specification (Gosling et al., 2005)》以及《Effective Java(Bloch, 2001)》,并使用[JPL n.m]、[CPJ n.m]、[JLS n.m]和[EJ Item n]来表示它们。 
  结束 “介绍”(第1章)之后,本书分为4部分: 
  基础。第一部分(第2~5章)关注于同步和线程安全的基本概念,以及如何使用类库提供的构建块组合线程安全类。110页上,有一个“并发诀窍清单”总结了出现在第一部分中最重要的规则。 
.  第2章(线程安全性)与第3章(共享对象)构成了全书的基础。几乎所有用来避免并发危险、创建线程安全类以及验证线程安全的规则都包括在这里。轻“理论”,重“实践”的读者可能会禁不住诱惑跳过这部分,而直接进入第二部分,但是在开始编写任何并发代码之前,一定要确保回过头来阅读这两章!第4章所涵盖的技术,用于把线程安全类组合到更大的线程安全类中。第5章(构建块)涵盖了平台核心库提供的并发构建块——线程安全的容器和同步工具(synchronizer)。 
  构建并发应用程序。第二部分(第6~9章)描述了如何利用线程提高并发应用程序的吞吐量或响应性。第6章(任务执行)讲述如何识别可并行执行的任务,并在任务执行框架内部执行它们。第7章讲到的技术可以让任务和线程在正常终止之前妥善地终止;区分并发应用程序是健壮的,还是仅仅可以将就工作的,有众多的因素,“程序如何处理取消与关闭”就是其中之一。第8章(应用线程池)关注了一些任务执行框架中更为高级的特性。 
  第9章(GUI应用程序)关注了用来提高单线程化子系统响应性的技术。 
  活跃度、性能和测试。第三部分(第10~12章)涉及并发程序自身。要确保并发程序执行了你所希望它做的事情,而且性能是可以接受的。第10章(避免活跃度危险)描述了如何避免活跃度失败,活跃度失败会阻止程序继续向前执行。第11章(性能和可伸缩性)涵盖的技术用来提高并发代码的性能和可伸缩性。第12章(测试并发程序)涵盖的技术用来测试并发代码的正确性和性能。 
  高级主题。第四部分(第13~16章)涵盖的主题可能只会引起资深程序员的兴趣:它们是显式锁、原子变量、非阻塞算法和开发自定义的synchronizer。 
  代码示例 
  尽管书中很多的通用概念适用于Java 5.0之前版本,甚至是非Java环境,不过大多数示例代码(以及关于Java存储模型的每一句话)都假定是以Java 5.0或更新的JDK为基础的。有些代码示例还会用到Java 6中添加到类库中的特性。 
  代码示例已经被裁减,以降低它们的尺寸和突出相关的部分。完整版本的代码示例、辅助示例和勘误表,可以从本书的网站http://www.javaconcurrencyinpractice.com上获得。 
  代码示例分为三类:“好”示例,“一般”示例和“坏”示例。“好”示例阐释的技术应该被效仿。“坏”示例阐释的技术绝对不应该被效仿,而且还会用一个“Mr. Yuk”1的图标清楚地表明这是“有害”的代码(参见清单1)。“一般”示例阐释的技术不一定是错的,但却是是脆弱的、有风险的或者执行效果差的,而且会用一个“Mr. CouldBeHappier”图标标识出来,如同清单2。 
  清单1 糟糕的清单排序方法(不要这样做) 
  public [T extends Comparable[? super T]] void sort(List[T] list) { 
  // 永远不要返回错误的答案 
  System.exit(0); 
  } 
  有些读者会质疑“坏”示例在本书中的角色;毕竟,一本书应该展现如何做正确的事,而不是错误的事。“坏”示例有两个目的。它们揭示了常见的缺陷,更重要的是它们示范了如何分析程序的线程安全性——完成此事的最佳办法就是观察威胁线程安全的各种方式。 
   
  清单2 缺少优化的清单排序方法 
  public [T extends Comparable[? super T]] void sort(List[T] list) { 
   for (int i=0; i[1000000; i++) 
   doNothing(); 
   Collections.sort(list); 
  } 
  致谢 
  java.util.concurrent包的开发过程催生了本书。这个包是由Java Community Process JSR 166创建的,后被加入到Java 5.0中。还有很多人为JSR 166作出过贡献;我们尤其要感谢Martin Buchholz,他完成了所有把代码植入JDK的相关工作;还要感谢concurrency-interest邮件清单的所有读者,他们为API的草案提供了他们的建议和反馈。 
  本书能够大幅度地完善,得益于大量的建议和帮助,这些帮助来自多方面的人员。我们要感谢Dion Almaer,Tracy Bialik,Cindy Bloch,Martin Buchholz,Paul Christmann,Cliff Click,Stuart Halloway,David Hovemeyer,Jason Hunter,Michael Hunter,Jeremy Hylton,Heinz Kabutz,Robert Kuhar,Ramnivas Laddad,Jared Levy,Nicole Lewis,Victor Luchangco,Jeremy Manson,Paul Martin,Berna Massingill,Michael Maurer,Ted Neward,Kirk Pepperdine,Bill Pugh,Sam Pullara,Russ Rufer,Bill Scherer,Jeffrey Siegal,Bruce Tate,Gil Tene,Paul Tyma,以及硅谷模式小组的成员,他们通过很多饶有趣味的技术交流,提供了指南,提出了建议,这些对本书能够做到更好颇有帮助。 
  我们格外感激Cliff Biffle,Barry Hayes,Dawid Kurzyniec,Angelika Langer,Doron Rajwan和Bill Venners,他们审阅了全部手稿,还关注了令人烦恼的细节,寻找代码示例中的bug,并且提出了大量令本书得以改进的建议。 
  我们感谢Katrina Avery,他出色地完成了copy-editing的工作;Rosemary Simpson在极端的时间压力下,还制作了索引。我们感谢Ami Dewar绘制的插图。 
  感谢Addison-Wesley的全体组员,他们让这本书得以问世。Ann Sellers让项目得以运行;Greg Doench 让项目的进度有条不紊;Elizabeth Ryan一直领导着本书写作的进程。 
  我们还想要感谢成千上万的软件工程师,他们开发了编写本书所用到的软件,间接地为本书作出了贡献。这些软件包括TEX,LATEX,Adobe Acrobat,pic,grap,Adobe Illustrator,Perl,Apache Ant,IntelliJ IDEA,GNU emacs,Subversion,TortoiseSVN,当然,还有Java平台与类库。... 

[Java Concurrency in Practice.zip]

本资料仅供个人学习参考,请勿用于商业用途,如有能力请尽量购买正版图书,也是对作者的支持。 如需下载加QQ群铂金信息技术交流群 151258054获取访问密码