1.5.3 多核并行

如今,CPU硬件的发展方向已经从高频率转变为多核心,随着多核时代的来临,软件开发越来越关注并行编程的领域。早在JDK 1.5就已经引入java.util.concurrent包实现了一个粗粒度的并发框架。而JDK 1.7中加入的java.util.concurrent.forkjoin包则是对这个框架的一次重要扩充。Fork/Join模式是处理并行编程的一个经典方法,如图1-5所示。虽然不能解决所有的问题,但是在此模式的适用范围之内,能够轻松地利用多个CPU核心提供的计算资源来协作完成一个复杂的计算任务。通过利用Fork/Join模式,我们能够更加顺畅地过渡到多核时代。

figure_0039_0007

图 1-5 Fork/Join模式示意图[1]

在Java 8中,将会提供Lambda支持,这将会极大改善目前Java语言不适合函数式编程的现状(目前Java语言使用函数式编程并不是不可以,只是会显得很臃肿),函数式编程的一个重要优点就是这样的程序天然地适合并行运行,这对Java语言在多核时代继续保持主流语言的地位有很大帮助。

另外,在并行计算中必须提及的还有OpenJDK的子项目Sumatra[2],目前显卡的算术运算能力、并行能力已经远远超过了CPU,在图形领域以外发掘显卡的潜力是近几年计算机发展的方向之一,例如C语言的CUDA。Sumatra项目就是为Java提供使用GPU(Graphics Processing Units)和APU(Accelerated Processing Units)运算能力的工具,以后它将会直接提供Java语言层面的API,或者为Lambda和其他JVM语言提供底层的并行运算支持。

在JDK外围,也出现了专为满足并行计算需求的计算框架,如Apache的Hadoop Map/Reduce,这是一个简单易懂的并行框架,能够运行在由上千个商用机器组成的大型集群上,并且能以一种可靠的容错方式并行处理TB级别的数据集。另外,还出现了诸如Scala、Clojure及Erlang等天生就具备并行计算能力的语言。

[1]图片来源:http://www.ibm.com/developerworks/cn/java/j-lo-forkjoin/。

[2]Sumatra项目主页:http://openjdk.java.net/projects/sumatra/。