似乎有很多關於多核和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