2009-03-02 66 views
16

似乎有很多关于多核和java的大惊小怪。虽然有人说java支持不是good enough,但它绝对是一个值得期待的领域。似乎有manytechniques来提高并发程序的性能。在多核场景中编写java程序的技巧

有关编程在多核心场景的任何提示/建议,赞赏。

+0

谁认为这个问题不具有建设性?这是建设性的。 – Xofo 2015-09-28 21:50:04

回答

21

研究Java 5中添加的新Java并发设施(在java.util.concurrent package中)。它提供的功能比常规的Thread更高级,这将使其更容易(并且更容易出错)写并发应用程序。 The Java TutorialsLesson: Concurrency将是一个很好的开始。

到目前为止,我只用了ExecutorService,这使得可以生产thread pools,到新的任务可以在Runnable S或Callable S(它可以执行后返回值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(); 

在上述(未测试的)代码,所有我担心就是使其成为Callablesubmit的一对,并将其用于ExecutorService,随后使用Future来检索结果。

一旦调用的get方法,如果处理未完成,程序将停止,直到可以检索到Future的结果。因此,在此示例中,即使f2的结果在f1之前可用,程序也会等到f1的结果可用。

在阅读材料方面,我很快购买的图书列表是Brian Goetz的Java Concurrency in Practice,它在Java的并发性出现时经常出现。

来自Java 5文档的Concurrency Utilities页面也包含更多信息。

6

总是一个很好的提示 - 如果你的大部分类都是不可变的,那么所有的事情都变得如此简单,因为不变性消除了担心从多个地方到多个地方的锁的需要。

+0

+1。 我总是将类设计为不可变的,只有在需要时才会做出变化。 – Fortyrunner 2009-03-02 08:19:22

8

最好的提示必须是:让你的同步正确!

这可能似乎有点明显但Java Memory Model的理解是至关重要的,挥发性最终领域特别是如何工作的,如何同步既作为互斥一个存储器屏障,然后新的java.util.concurrent构造以及

2

查看Brian Goetz的演讲From concurrent to Parallel来自Devoxx 2008。那里并没有太多提示,但它提供了一个有关Java并发性在何处的想法。

1

实用技巧最好的书已经Java Concurrency in Practise。对于所有java程序员来说,这是一个必须读的东西,即使是那些认为他们不做任何并发编程的人也是如此,因为java在其各种库中有许多隐藏的线程(回想起来,与servlet一样)。

3

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

此外,您可能希望查看诸如Clojure之类的基于JVM的语言,它们声称可以更轻松地进行多核并行编程。

3

作为Java自己的并发共享内存方法的替代方案,您还可以在Java之上查看Actor-based concurrency using Scala,这为并发编程提供了更简单的模型。

1

我的提示:了解Java内存模型(自JDK 5及更高版本以来)。大多数人不知道,同步,易失性和最终的超出正常多线程范围的附加意义。

Java适用于多CPU和多核。如果你编程正确并且投入了一些大脑,那么你将得到一个高度并发的服务器系统来利用8核心,包括很多同步等等。我们对它很满意...... JDK6比JDK5更好,并且所有的东西都在多CPU的机器上。

2

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

在一些Skandium sopported的图案的有:

  • 主从: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);
  • 用不同的代码路径地图-减少:Fork<P,R>(split, nested, merge);
  • 递归分而治之:DaC<P,R>(condition, split, nested, merge);

所有图案可以嵌套和组合,所以你可以在分而治之内拥有农场等。