2009-03-02 70 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);

所有圖案可以嵌套和組合,所以你可以在分而治之內擁有農場等。