写点什么

Java SE 7 的新并发特性

  • 2007 年 7 月 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 年 7 月 05 日 20:001459
用户头像

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

关注

评论

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

学习-1

4anonymous

Go语言,深入了解 select 实现原理

微客鸟窝

Go 语言 8月日更

架构实战打怪升级day01

晏鹏

架构师训练营2期模块一作业

kazeMace

架构实战营

架构实战营-模块一作业

Alex.Wu

【架构实战营作业】模块一:微信业务架构图&学生管理系统

聆息

你最想了解的红队实战攻防技术,来了

网络安全学海

黑客 网络安全 信息安全 WEB安全 安全漏洞

微信业务架构图&毕业设计之学生管理系统(model1)

消失的子弹

微信 架构图

我的微信业务架构图

白开水又一杯

#架构实战营

基于java springboot android 安卓报修系统源码(毕设)

清风

Java Android Studio 毕业设计

Coffee学架构:架构设计001(怎么做架构设计)

咖啡

架构设计实战

模块1作业

atob

微服务的痛:用实际经历告诉你它有多坑(三)

我爱娃哈哈😍

微服务 架构设计

微信业务架构和学生管理系统架构设计

王家辉

微信业务架构&毕设学生管理架构选择

Sky

架构实战营

Ubuntu Server 20.04 搭建安装Kubernetes

玏佾

Kubernetes k8s文档 k8s资源 #k8s

微信业务架构图&学生管理系统设计思路

刘琦Logan

我的学生管理系统

白开水又一杯

#架构实战营

网络攻防学习笔记 Day117

穿过生命散发芬芳

网络安全 8月日更

【架构训练营】【模块一】【作业】【微信业务架构】【学生管理系统架构】

简直走不拐弯

极客时间 作业 架构训练营

架构实战营模块一作业-初识架构

娜酱

#架构实战营

游戏开发者的通关之旅,华为AGC for Games带来了什么?

脑极体

架构实战课程 模块一作业

Frank

Linux之seq命令

入门小站

Linux

模块一作业:微信业务架构图与学生管理系统毕设架构设计

apple

百度地图开发-与地图的交互功能 06

Andy阿辉

android Android Studio Android 小菜鸟 8月日更

如何在 MacOS 上降级 Java 版本

escray

学习 8月日更

在线JSON转HTML,TABLE表格工具

入门小站

工具

深入了解现代web浏览器(第二部分)

GKNick

大前端 浏览器

模块一作业

bin

架构实战☞ 微信业务架构&学生管理系统架构设计

眼镜盒子

架构实战营

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