关于多核和java似乎有很多大惊小怪的。虽然有人说对 java 的支持不够好,但它似乎绝对是一个值得期待的领域。似乎有许多 技术可以提高并发程序的性能。
任何关于在多核场景中编程的提示/建议都值得赞赏。
查看 Java 5 中添加的新 Java 并发工具(在java.util.concurrent
package中)。它提供了比常规 s 更高级的功能,Thread
这将使编写并发应用程序更容易(并且更不容易出错)。课程: Java 教程的并发性将是一个很好的起点。
到目前为止,我只使用了ExecutorService
,它允许可以产生线程池Runnable
,新任务可以以s或s为单位移交给它Callable
(执行后可以返回值作为Future
s),实际的线程代码由处理ExecutorService
. _
例如,使用 2 个线程的线程池执行一些计算,并获得结果可以很简单:
ExecutorService es = Executors.newFixedThreadPool(2);
Future f1 = es.submit(new Callable<Integer>() {
public Integer call()
{
// Do some processing...
return someInteger;
}
});
Future f2 = es.submit(new Callable<Integer>() {
public Integer call()
{
// Do some processing...
return someInteger;
}
});
Integer firstInteger = f1.get();
Integer secondInteger = f2.get();
在上面的(未经测试的)代码中,我所要担心的是制作几个Callable
s 并将submit
其添加到 theExecutorService
和稍后,使用Future
s 来检索结果。
关键是,一旦调用了 的get
方法Future
,如果处理没有完成,程序将停止,直到Future
可以检索到的结果。所以,在这个例子中,即使 的结果在f2
之前是可用f1
的,程序也会一直等到 的结果f1
可用。
在阅读材料方面,我即将购买的书籍清单是Brian Goetz 的Java Concurrency in Practice,当提到 Java 的并发性时,它经常出现。
Java 5 文档中的Concurrency Utilities页面也提供了更多信息。
最好的提示是:正确同步!
这似乎有些明显,但对Java 内存模型的理解至关重要,特别是volatile和final字段如何工作,同步如何充当互斥锁和内存屏障,以及新的java.util.concurrent
构造
总是一个很好的提示——如果你的大多数类都是不可变的,那么一切都会变得容易得多,因为不变性消除了担心从多到少关注的地方的锁的需要。
查看即将推出的fork-join 框架。fork-join 框架使开发人员能够在多核架构上实现细粒度的并行性。
此外,您可能想查看基于 JVM 的语言,如Clojure,它们声称使多核并行编程更容易。
作为 Java 自己的并发共享内存方法的替代方案,您还可以在 Java 之上使用 Scala研究基于 Actor 的并发,它为并发编程提供了一个更简单的模型。
查看来自 Devoxx 2008 的 Brian Goetz 的演讲From concurrent to Parallel。那里没有太多技巧,但它让您了解 Java 并发的发展方向。
您可以尝试使用并行模式库,例如Skandium for Java。只需选择您想要的并行模式并填写缺失的钩子即可。
Skandium 支持的一些模式是:
Farm<P,R>(nested);
For<P,R>(nested, i);
While<P,R>(nested, condition);
If<P,R>(condition, trueCase, falseCase);
Map<P,R>(split, nested, merge);
Fork<P,R>(split, nested, merge);
DaC<P,R>(condition, split, nested, merge);
所有模式都可以嵌套和组合,因此您可以在分而治之的情况下拥有农场等。
最好的实用技巧书籍是Java Concurrency in Practice。这是所有 Java 程序员的必读之书,即使是那些认为他们不进行任何并发编程的人,因为 Java 在其各种库中具有许多隐藏的线程(想到 Swing,与 servlet 相同)。
我的提示:了解 Java 内存模型(从 JDK 5 及更高版本开始)。大多数人不知道,同步、volatile 和 final 在正常的多线程范围之外还有一个额外的含义。
Java 适用于多 CPU 和多核。如果你对它进行了正确的编程并投入了一些精力,你就会得到一个高度并发的服务器系统来利用 8 核,包括大量的同步等。我们对此非常满意……JDK6 比 JDK5 好,而且下面的一切都在多 CPU 机器上很烂。