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

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

    少了一句

    2007年7月5日 下午4时24分 发表人 Guanglei Li

    第一个使用层次: 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

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

深度内容

和Google互补的搜索引擎Wolfram|Alpha

Wolfram|Alpha与Google究竟是什么关系,Wolfram|Alpha自己是如何定位的?Wolfram|Alaph在多大程度上是语义网搜索呢?InfoQ中文站就等等这些问题采访了Wolfram研究公司中国区商务经理王翔。

SOA契约成熟度模型

本文说明了所推荐的契约版本管理设计策略是如何与SOA成熟度模型发生联系的。文章目的是为实现版本管理和可组合性提供一个路线图。

数据服务简介

Vijay Narayanan在这篇文章中对数据服务的几个方面进行了介绍,它们都是SOA实践者和数据架构师感兴趣的内容。本文对数据服务的几个方面进行了介绍,包括需求定义,基本原理和好处、范围、开发以及消费模式。

分块云计算

在本文中,Jimmy Nilsson描述了一种他在过去数年间观察到的一种正在缓慢成长的架构风格,他把这种风格称为“分块云计算”。

豆瓣网技术架构变迁

罗马不是一天建成的,豆瓣的技术架构也是随着用户规模的增长一直在持续变化中。在本次演讲中,豆瓣的首席架构师洪强宁将与大家一起分享从上线时的单台服务器架构开始一直到现在的豆瓣架构变迁历程。

融合思想:深入探索S#arp架构

Billy McCafferty展示了S#arp架构,它在ASP.NET MVC框架的基础上,荟萃了当今的最佳实践,应用在ASP.NET Web应用程序的架构设计中。

王雷谈开源以及新兴市场计划

中国作为新兴市场中的新兴市场,是Sun在美国之外实施SSE(SUN Startup Essentials)项目重点关注的地区。在QCon Beijing 2009期间,InfoQ中文站有幸对此项目的负责人王雷先生进行了采访,探讨了关于开源、新兴市场、SSE等话题。

使用HTML5构建下一代的Web Form

HTML5 是由 WHATWG发起的,最开始的名称叫做Web Application 1.0,而后这个标准吸纳了Web Forms 2.0的标准,并一同被W3C组织所采用,合并成为下一代的HTML5标准。