天天看点

Java7 java.util.concurrent 并发包计划

 java7发布版本的具体计划应该开始了,之前经常有人问我们关于jsr166的后续计划包含哪些内容。下面是目前暂定的内容,欢迎提出你们的见

解和意见。

1.phasers

   一个通用的内存屏障实现。

2.linkedtransferqueue (and transferqueue interface)

  一个具有非阻塞,阻塞和同步接口的队列。

3. concurrentreferencehashmap

  并发hash map,其键和值可以是弱引用或者软引用。

4. fences (in java.util.concurrent.atomic)

   底层的内存屏障实现

5. forkjoin framework.

   (具体见下面)

       这些功能的初始版本可以在很多地方看到。phasers 和 linkedtransferqueues在jsr166y中,

说明文档还需要再做一些修改,同时fences api也需要java虚拟机的支持。(目前任何java虚拟机上实现的fences api都有效率问题,在fences api能高效执行之前是没有多大用处的) 加入这个fences api也是为了更好的与即将到来的c++0x apis相对应。

       jason greene基于concurrenthashmap编写了concurrentreferencehashmap。我想最新的版本应该是在这里

<a href="http://viewvc.jboss.org/cgi-bin/viewvc.cgi/jbosscache/experimental/jsr166/src/jsr166y/concurrentreferencehashmap.java?view=markup" target="_blank">http://viewvc.jboss.org/cgi-bin/viewvc.cgi/jbosscache/experimental/jsr166/src/jsr166y/concurrentreferencehashmap.java?view=markup</a>

我们推迟集成concurrenthashmap,因为需要等待gc支持ephemerons(一个弱引用键-值链的方案)。虽然此举可以推动其它部门,但我不认为ephemeron能很快得到支持,所以我们需要考虑在gc不支持ephemerons情况下完成concurrenthashmap。

      大多数人都知道目前的forkjoin 框架有两部分组成,基本forkjoin{pool,task}框架,以及基于这个基本框架的并行集合(目前只有parallelarray)。我考虑只把基本框架集成进jdk,把并行集合部分作为非jdk的包继续开发。这样做可以避免暴露接口(intandlongtoint 等96个接口)和表达式问题(闭包等),而且要把这些加入jdk也需要艰难的讨论。推迟加入可以有更多的时间来激励开发和使用并发集合的包,同时也可以有时间让ide,语言扩展和另外的jvm语言来支持。

       同时我已经开始审阅把forkjoin和executor集成起来。forkjoinpool会实现executor的服务,forkjointask会实现future。(使之成为可能的主要思想是让控制阻塞和创建备用线程之间保持并发)。这可以更好的满足在fortress and x10使用(这两种语言编译后会运行在jvm上)。但它也开始构建人们想要但却未曾开始着手干的基础设施,比如创建一系列循环(非 forkjoin类型),每个循环有时候会创建forkjoin任务。

更多细节将继续(获得内部并行维护行之有效会慢),但只增加简单的基础框架到java.util.concurrent: 类 forkjoinpool (类forkjoinworkerthread 仍会为高级使用者和性能调优者保留)和 抽象类forkjointask,以及三个子类recursiveaction,recursivetask, asyncforkjoinaction(最新一次修订后是为了用来在不提供类的情况下,构建诸如binaryasyncaction的类)。

       我会等待你们对这些内容的意见和建议,之后再把这些内容到恰当的地方。(恰当的地方的意思是,我会把这内容整合进jsr66y, 然后加入

java.util.concurrent 包中).