BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

Java SE 7的新并发特性

| 作者 Geoffrey Wiseman 关注 0 他的粉丝 ,译者 宋玮 关注 0 他的粉丝 发布于 2007年7月6日. 估计阅读时间: 6 分钟 | 都知道硅谷人工智能做的好,你知道 硅谷的运维技术 也值得参考吗?QCon上海带你探索其中的奥义

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

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

少了一句 by Li Guanglei

第一个使用层次:

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.

Re: 少了一句 by 胡 键

谢谢指正!把译文保存到发布系统中,少复制了一句。
出现这种事情是我们的疏忽,以后我们会注意检查的。

读者的批评指正是我们保持高质量工作的保证。当然,我们会尽量地使以后这些批评少一些;)。

再次感谢!

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

2 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT