似乎有很多关于多核和java的大惊小怪。虽然有人说java支持不是good enough,但它绝对是一个值得期待的领域。似乎有manytechniques来提高并发程序的性能。在多核场景中编写java程序的技巧
有关编程在多核心场景的任何提示/建议,赞赏。
似乎有很多关于多核和java的大惊小怪。虽然有人说java支持不是good enough,但它绝对是一个值得期待的领域。似乎有manytechniques来提高并发程序的性能。在多核场景中编写java程序的技巧
有关编程在多核心场景的任何提示/建议,赞赏。
研究Java 5中添加的新Java并发设施(在java.util.concurrent
package中)。它提供的功能比常规的Thread
更高级,这将使其更容易(并且更容易出错)写并发应用程序。 The Java Tutorials的Lesson: 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();
在上述(未测试的)代码,所有我担心就是使其成为Callable
和submit
的一对,并将其用于ExecutorService
,随后使用Future
来检索结果。
一旦调用的get
方法,如果处理未完成,程序将停止,直到可以检索到Future
的结果。因此,在此示例中,即使f2
的结果在f1
之前可用,程序也会等到f1
的结果可用。
在阅读材料方面,我很快购买的图书列表是Brian Goetz的Java Concurrency in Practice,它在Java的并发性出现时经常出现。
来自Java 5文档的Concurrency Utilities页面也包含更多信息。
总是一个很好的提示 - 如果你的大部分类都是不可变的,那么所有的事情都变得如此简单,因为不变性消除了担心从多个地方到多个地方的锁的需要。
+1。 我总是将类设计为不可变的,只有在需要时才会做出变化。 – Fortyrunner 2009-03-02 08:19:22
最好的提示必须是:让你的同步正确!
这可能似乎有点明显但Java Memory Model的理解是至关重要的,挥发性和最终领域特别是如何工作的,如何同步既作为互斥和一个存储器屏障,然后新的java.util.concurrent
构造以及
查看Brian Goetz的演讲From concurrent to Parallel来自Devoxx 2008。那里并没有太多提示,但它提供了一个有关Java并发性在何处的想法。
实用技巧最好的书已经Java Concurrency in Practise。对于所有java程序员来说,这是一个必须读的东西,即使是那些认为他们不做任何并发编程的人也是如此,因为java在其各种库中有许多隐藏的线程(回想起来,与servlet一样)。
查看即将发布的fork-join framework。 fork-join框架使开发人员能够在多核架构上实现细粒度的并行。
此外,您可能希望查看诸如Clojure之类的基于JVM的语言,它们声称可以更轻松地进行多核并行编程。
作为Java自己的并发共享内存方法的替代方案,您还可以在Java之上查看Actor-based concurrency using Scala,这为并发编程提供了更简单的模型。
我的提示:了解Java内存模型(自JDK 5及更高版本以来)。大多数人不知道,同步,易失性和最终的超出正常多线程范围的附加意义。
Java适用于多CPU和多核。如果你编程正确并且投入了一些大脑,那么你将得到一个高度并发的服务器系统来利用8核心,包括很多同步等等。我们对它很满意...... JDK6比JDK5更好,并且所有的东西都在多CPU的机器上。
您可以尝试为Java使用并行模式库,例如Skandium。只需选择你想要的并行模式并填入缺失的钩子。
在一些Skandium sopported的图案的有:
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);
所有图案可以嵌套和组合,所以你可以在分而治之内拥有农场等。
谁认为这个问题不具有建设性?这是建设性的。 – Xofo 2015-09-28 21:50:04