InfoQ

新闻

Java SE 7的新并发特性

作者 Geoffrey Wiseman译者 宋玮 发布于 2007年7月5日 下午8时0分

社区
Java
主题
编程
标签
并发,
Java SE

JSR-166 帮助将Doug Lea的并发框架带入到Java SE 5。该工作作为jsr166x被带到Java SE 6中,它为Java collections框架增加了一些并发特性。

尽管Java SE 7的内容仍在不断变动,早期包含在其中的并发特性候选已经成形为jsr166y:一个fork/join框架和一个传递队列。InfoQ与Doug Lea谈及了这些特性及Java SE 7中的并发性。

fork/join框架是一个“多核友好的、轻量级并行框架 ”,它支持并行编程风格,将问题递归拆分成多个更小片断,以并行和调配的方式解决,如同Java Fork/join框架 中描述的伪代码那样:

Result solve(Problem problem) {
if (problem is small)
directly solve problem
else {
split problem into independent parts
fork new subtasks to solve each part
join all subtasks
compose result from subresults
}
}

这确保了工作可以并行完成且在多核系统上运行良好:

在Java 7 生命周期内,大的(32+)多核系统将大量出现,有了这个框架可以让人们对计算密集型任务获得相对简单的增速方法。目前,forkjoin在如Sun Niagaras和Azuls这样的机器上工作得最好,它们只是即将普及的并行处理器。Forkjoin在标准SMP上工作的也不错。总体来讲,少于4处理器的话你不并能获得太多增速效果——其主要目标是针对成打到成百处理器范围。

假如充分分解任务的大小,那么创建一个线程的开销有可能超出执行该任务的开销。因此,fork/join框架使用与可用核数相匹配的适当大小的线程池,以减少这种频繁交换的开销。为避免线程空闲,框架包含了一个工作窃取方法,该方法可以使空闲线程从一个执行较慢的线程中窃取等待其处理的工作。该Java Fork/join框架 说明书描述了fork/join框架所使用的机制并展示了多核系统性能样例,还与其他相似并行编程框架进行了对比。

Doug Lea描述了fork/join框架最可能的使用场景和采用过程:

总之,我期望其使用曲线与其他并发工具雷同。最初,只有较少真正需要的人使用它们,但最终很难找到不依赖于它们的程序,它们常常深埋在底层基础架构组件中。因此,表面语法支持可能并不是那么重要——类库/组件开发者越是想合并它们,其用法越是表现的笨拙。

理想的情况下,有几个使用层次:
1. “并行做事”层次,语言或工具翻译成并行代码,同时检查安全性/活跃性。这仍部分处于研究领域。

2. 安排集合的并行操作。——map、reduce、apply等等。那些想使用一次性操作特性操纵集合的程序员们,可以使用这些特性来提高常用处理类型的速度。(这是ListTasks、ArrayTasks等等层次)

3. 手工生效forkjoin以解决特定问题。这是我正在全力投入的层次,以确保我们可能使用工作窃取框架来支持范围广泛的并行算法。(当前一些怪模怪样的和缺乏解释的方法,如isQuiescent是为这种高级用法设计的。多数程序只使用“fork”和“join”,但当你需要其他这些方法时,它们也被提供了。)

4. 扩展框架以创建新类型的ForkJoinTasks等等。例如,那些需要事务的操作。只有很少量的人(例如,或许是Fortress运行时类库开发者)需要这么做,但是需要有足够的基础扩展钩子来才能做好。

Java SE 7 的另外一个候选是TransferQueue。TransferQueue扩展了BlockingQueue接口,增加了生产方阻塞,生产者在两方都准备好时将一个对象传递给消费者。非阻塞和超时风格传递也是可用的。它适合于一些消息传送应用,这里传递是必须的,并且“去创建一个简单易用的线程池,其中有时任务必须同步传递”。

传递队列和fork/join框架也许不是仅有的加入Java SE 7的并发特性。按照Doug Lea的说法,有正在进行中的新要求和需要加强的特性,包括可扩展计数器,一个ConcurrentIdentityHashMap,“增加原子包以更好支持专家模式微调内存模型效果”以及对java.util.Collections的算法改进。

jsr166y的成果建立在Java SE 6的jsr166x基础之上,jsr166x为Java SE6带来了新的collections:DequeBlockingDequeNavigableSetNavigableMapConcurrentNavigableMap (以及其实现类,ArrayDequeLinkedBlockingDequeConcurrentSkipListSetConcurrentSkipListMap 和增强的TreeMap )。

关于JSR-166、jsr166x和jsr166y更多的信息,访问Concurrency Interest网站。InfoQ 将让你与Java SE 7的发展与时俱进。

查看英文原文:New Concurrency Features for Java SE 7

2 条回复

回复

少了一句 发表人 Chelsea Ajax 发表于 2007年7月5日 下午4时24分
Re: 少了一句 发表人 gem fox 发表于 2007年7月5日 下午9时54分
  1. 返回顶部

    少了一句

    2007年7月5日 下午4时24分 发表人 Chelsea Ajax

    第一个使用层次: Do this stuff in parallel" level, where a language or tools translates into parallel-ese, while also checking for safety/liveness. This is still partially in the realm of research though.

  2. 返回顶部

    Re: 少了一句

    2007年7月5日 下午9时54分 发表人 gem fox

    谢谢指正!把译文保存到发布系统中,少复制了一句。 出现这种事情是我们的疏忽,以后我们会注意检查的。 读者的批评指正是我们保持高质量工作的保证。当然,我们会尽量地使以后这些批评少一些;)。 再次感谢!

独家内容

世界顶尖运动队教练的成功秘诀

本文列出了来自于顶级教练Marc Lammers的9条原则,他是在打造世界最佳曲棍球队的过程中发现这些原则的,文章把这些原则映射到了软件开发实践之中。

探索JVM上的LISP

本文由Per Jacobsson所作,目标读者为有意了解Lisp的Java开发人员。文章探讨了当前可以运行于JVM上的不同Lisp方言,以明快简洁的方式介绍了Lisp程序设计工作机理和其独特之处,并在最后演示了Lisp代码同Java系统的整合过程。

Ruby/Rails: 不一样的'Web'应用

本文以一个实际应用的例子为引子,探讨Ruby/Rails在非传统web系统中应用,以及研究如何定制以Rails为基础的领域特定的MVC框架。

认识云计算

本视频对云计算进行了简要的介绍,主要包括了五部分内容:首先带大家认识“云”,然后对计算机的发展过程进行了阐述,接着介绍了业界现状和企业级/世界级计算的新布局,最后对云计算做了一下展望。

AtomServer:数据分发的发布动力

在这篇文章中,Bryon Jacob和Chris Berry介绍了AtomServer,一个基于Apache Abdera的完整Atom存储实现。在去年,作者一直致力于为其雇主——Homeaway——实现一个Atom存储,现在已开源了其Atom存储框架:AtomServer。

从卓越工程角度看微软中国开发团队的成长

开发团队的成长离不开优秀的人才,简捷有效的流程和高效率工具这三个卓越工程系统中的重要因素。本文作者从这三个因素分析了微软中国开发团队是如何“从优秀到卓越”的。

利用Ruby简化你的Java测试

本文是Productive Java with Ruby系列文章的第一篇,我将从单元测试这个话题开始,让Java的开发人员能够在实际工作中利用Ruby提高工作效率。

与赵进聊SaaS

InfoQ中文站有幸与阿里软件的首席架构师赵进在一起探讨了SaaS的相关话题,包括SOA和ASP与SaaS的异同、云计算、SaaS的前景、它的关键技术、技术瓶颈等等。