写点什么

Java SE 7 的新并发特性

  • 2007-07-05
  • 本文字数:1813 字

    阅读完需:约 6 分钟

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) {<br></br> if (problem is small)<br></br> directly solve problem<br></br> else {<br></br> split problem into independent parts<br></br> fork new subtasks to solve each part<br></br> join all subtasks<br></br> compose result from subresults<br></br> }<br></br>}<br></br>这确保了工作可以并行完成且在多核系统上运行良好:

在 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: Deque BlockingDeque NavigableSet NavigableMap ConcurrentNavigableMap (以及其实现类, ArrayDeque LinkedBlockingDeque ConcurrentSkipListSet ConcurrentSkipListMap 和增强的 TreeMap )。

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

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

2007-07-05 20:001485
用户头像

发布了 150 篇内容, 共 39.8 次阅读, 收获喜欢 8 次。

关注

评论

发布
暂无评论
发现更多内容

架构实战营 模块四 作业

脉醉

#架构实战营

模块四作业

河马先生

架构实战营

模块四作业

绝影

架构训练营

占楼

IT蜗壳-Tango

8月日更

【前端 · 面试 】HTTP 总结(八)—— HTTP 强缓存

编程三昧

面试 HTTP 8月日更 HTTP缓存

架构实战营-模块八作业

fazinter

架构实战营

千万级学生管理系统的考试试卷存储方案设计

tjudream

redis 架构

设计千万级学生管理系统的考试试卷存储方案

君子意如何

「架构师训练营第 1 期」

千万级学生管理系统的考试试卷存储方案

feitian

模块4作业G20210698020270

哆啦A萌

架构实战营 毕业总结

TH

架构实战营

二维码批量生成下载工具

入门小站

工具

惊!Go里面居然有这样精妙的小函数!

Gopher指北

Go 语言

【设计模式】装饰器模式

Andy阿辉

C# 后端 设计模式 8月日更

前端之数据结构(五)二叉树

Augus

数据结构 8月日更

架构实战营-毕业设计

大可

架构实战总结

华仔架构训练营

架构训练营毕业设计—电商秒杀系统

Neil43

架构训练营

电商秒杀系统

唐江

架构实战营

毕设:设计电商秒杀系统

ifc177

前端通讯协议:WebSocket和长轮询

devpoint

ajax websocket 8月日更

Linux之route命令

入门小站

Linux

架构实战营 毕业设计

TH

架构实战营

7月日更总结

耳东@Erdong

个人成长 个人总结 8月日更

百万量级的架构设计

俞嘉彬

架构实战营

【架构训练营】模块四作业

zclau

架构实战营 - 模块 4- 设计千万级学生管理系统的考试试卷存储方案

蔸蔸

删除容器报错:Error response from daemon: conflict: unable to delete

liuzhen007

8月日更

使用 make 还是 new

Rayjun

Go 语言

架构实战营作业 M04

Shawn Liu

架构训练营第 1 期 模块四作业

高远

Java SE 7的新并发特性_Java_Geoffrey Wiseman_InfoQ精选文章