16

关于多核和java似乎有很多大惊小怪的。虽然有人说对 java 的支持不够,但它似乎绝对是一个值得期待的领域。似乎有许多 技术可以提高并发程序的性能。

任何关于在多核场景中编程的提示/建议都值得赞赏。

4

9 回答 9

21

查看 Java 5 中添加的新 Java 并发工具(在java.util.concurrentpackage中)。它提供了比常规 s 更高级的功能,Thread这将使编写并发应用程序更容易(并且更不容易出错)。课程: Java 教程的并发将是一个很好的起点。

到目前为止,我只使用了ExecutorService,它允许可以产生线程池Runnable,新任务可以以s或s为单位移交给它Callable(执行后可以返回值作为Futures),实际的线程代码由处理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();

在上面的(未经测试的)代码中,我所要担心的是制作几个Callables 并将submit其添加到 theExecutorService和稍后,使用Futures 来检索结果。

关键是,一旦调用了 的get方法Future,如果处理没有完成,程序将停止,直到Future可以检索到的结果。所以,在这个例子中,即使 的结果在f2之前是可用f1的,程序也会一直等到 的结果f1可用。

在阅读材料方面,我即将购买的书籍清单是Brian Goetz 的Java Concurrency in Practice,当提到 Java 的并发性时,它经常出现。

Java 5 文档中的Concurrency Utilities页面也提供了更多信息。

于 2009-03-02T07:17:56.817 回答
8

最好的提示是:正确同步!

这似乎有些明显,但对Java 内存模型的理解至关重要,特别是volatilefinal字段如何工作,同步如何充当互斥锁内存屏障,以及新的java.util.concurrent构造

于 2009-03-02T07:48:05.653 回答
6

总是一个很好的提示——如果你的大多数类都是不可变的,那么一切都会变得容易得多,因为不变性消除了担心从多到少关注的地方的锁的需要。

于 2009-03-02T07:28:19.927 回答
3

查看即将推出的fork-join 框架。fork-join 框架使开发人员能够在多核架构上实现细粒度的并行性。

此外,您可能想查看基于 JVM 的语言,如Clojure,它们声称使多核并行编程更容易。

于 2009-03-02T16:31:06.253 回答
3

作为 Java 自己的并发共享内存方法的替代方案,您还可以在 Java 之上使用 Scala研究基于 Actor 的并发,它为并发编程提供了一个更简单的模型。

于 2009-03-02T16:35:56.337 回答
2

查看来自 Devoxx 2008 的 Brian Goetz 的演讲From concurrent to Parallel。那里没有太多技巧,但它让您了解 Java 并发的发展方向。

于 2009-03-02T08:08:15.027 回答
2

您可以尝试使用并行模式库,例如Skandium for Java。只需选择您想要的并行模式并填写缺失的钩子即可。

Skandium 支持的一些模式是:

  • 主从:Farm<P,R>(nested);
  • 管道:`管道(stage1,stage2);
  • 对于迭代:For<P,R>(nested, i);
  • 条件迭代:While<P,R>(nested, condition);
  • 条件分支:If<P,R>(condition, trueCase, falseCase);
  • 地图减少:Map<P,R>(split, nested, merge);
  • 具有不同代码路径的 Map-reduce:Fork<P,R>(split, nested, merge);
  • 递归分而治之:DaC<P,R>(condition, split, nested, merge);

所有模式都可以嵌套和组合,因此您可以在分而治之的情况下拥有农场等。

于 2009-09-24T01:39:32.547 回答
1

最好的实用技巧书籍是Java Concurrency in Practice。这是所有 Java 程序员的必读之书,即使是那些认为他们不进行任何并发编程的人,因为 Java 在其各种库中具有许多隐藏的线程(想到 Swing,与 servlet 相同)。

于 2009-03-02T10:13:16.910 回答
1

我的提示:了解 Java 内存模型(从 JDK 5 及更高版本开始)。大多数人不知道,同步、volatile 和 final 在正常的多线程范围之外还有一个额外的含义。

Java 适用于多 CPU 和多核。如果你对它进行了正确的编程并投入了一些精力,你就会得到一个高度并发的服务器系统来利用 8 核,包括大量的同步等。我们对此非常满意……JDK6 比 JDK5 好,而且下面的一切都在多 CPU 机器上很烂。

于 2009-03-12T03:10:09.370 回答