java多核
① java教程之Java應用如何適應多核環境
通過使用JDK 6.0的新特徵,就可以讓它們能夠並行化,讓客戶端應用程序利用多核處理器的優勢。以使用單核JDK數組排序演算法為例,這篇文章略述實現細節,重點講解並行演算法。在雙核的機器上,即使一個簡單的實現結果能夠加速35%。 摩爾定律失效 知道一兩年前,API提供商能夠簡單的依靠一個經驗觀測值做出判斷,這個經驗觀測值是由Gordon Moore在1965始創的,他是Intel創始人之一。摩爾定律指出每18到24個月集成電路上的晶體管的數量至少要翻一番。對於軟體開發者來說,這就意味著你寫了一個程序,當時運行在一個單核CPU上,過年兩年後,你的這個相同的程序運行在兩年後的單核CPU上速度肯定會快兩倍。只要操作系統向後兼容的話,你甚至不需要編譯你的程序。 但是,在最近兩年,硬體製造商開始找到產品的瓶頸了,不去非常費成本的提供單個晶元的計算能力。他們的解決方案就是首先就是伺服器市場和客戶端市場,在同一個晶元上放置多個處理器,並不是去增加每個處理器的處理速度。對於軟體世界來說,這就意味著你不能「坐享其成,與己無關」了。如果你的程序有一個簡單的順序流程,那麼就不能享受底層多核硬體帶來的優點了。這個道理同樣適用於你正在寫的那些程序和一些語言的核心語言庫。
② java能利用多核cpu嗎
java線程可以在運行在多個cpu核上。
"在具有多個處理器的機器上,每一個處理器運行一個線程,可以有多個線程並行運行。當然,如果線程的數目多於處理器的數目,調度器依然採用時間片機制"。
現代os都將線程作為最小調度單位,進程作為資源分配的最小單位。 在windows中進程是不活動的,
只是作為線程的容器。
也就是說,java中的所有線程確實在JVM進程中,但是CPU調度的是進程中的線程。
"在具有多個處理器的機器上,每一個處理器運行一個線程,可以有多個線程並行運行。當然,如果線程的數目多於處理器的數目,調度器依然採用時間片機制"。這句話足以用來反駁那個出問題的人了,因為他的答案本身就是錯的。
更詳細的信息可以參見有關Java虛擬機實現的「並發」系列講解,基本上每本關於Java虛擬機有關的書籍以及官方文檔都會講到JVM如何實現線程的幾種方式。 基於系統內核,基於用戶線程等等實現。JVM中的線程實現是本地化的~ 本地化的意思就是與平台有關了,盡管與平台有關,但是線程調度,仍舊是最佳高效的方式,有資料曾說過:線程的創建銷毀與調度的開銷是進程的三十分之一。
③ java多線程問題多核cpu遇上java多線程,求解釋,代碼如下:
以及成為一個線程的三種方法。最後補充一點:注意當今多核CPU下Java多線程會出現問題。JVM規范里明確指出:JVM的多線程是不確定的(真正意義上的多線程),
④ Java:關於多線程與多核,如何將多核都利用上呢
你自己寫個多線程的程序跑起來,把任務管理器打開,打開「性能」選項卡,觀察你就發現了,其實不管你你的是4核,8核,1024核,基本都是在一個格子里有動作的,跟理論上幾個線程就在幾個核里跑不一致的,操作系統自身的設計導致的。核雖然多,縣城雖然多,但是還沒有真正設計成幾個線程就在幾個核里跑的演算法模式。至於怎麼都利用上不是你說了算,os說了算。別想太多。
⑤ java 多核處理器下會發生同時獲取對象鎖的情況嗎
對象鎖類鎖
對象鎖
當一個對象中有synchronized method或synchronized block的時候調用此對象的同步方法或進入其同步區域時,就必須先獲得對象鎖。如果此對象的對象鎖已被其他調用者佔用,則需要等待此鎖被釋放
同步靜態方法/靜態變數互斥體
由於一個class不論被實例化多少次,其中的靜態方法和靜態變數在內存中都只由一份。所以,一旦一個靜態的方法被申明為synchronized。此類所有的實例化對象在調用此方法,共用同一把鎖,我們稱之為類鎖。一旦一個靜態變數被作為synchronized block的mutex。進入此同步區域時,都要先獲得此靜態變數的對象鎖
類鎖
由上述同步靜態方法引申出一個概念,那就是類鎖。其實系統中並不存在什麼類鎖。當一個同步靜態方法被調用時,系統獲取的其實就是代表該類的類對象的對象鎖
在程序中獲取類鎖
可以嘗試用以下方式獲取類鎖
synchronized (xxx.class) {}
synchronized (Class.forName("xxx")) {}
同時獲取2類鎖
同時獲取類鎖和對象鎖是允許的,並不會產生任何問題,但使用類鎖時一定要注意,一旦產生類鎖的嵌套獲取的話,就會產生死鎖,因為每個class在內存中都只能生成一個Class實例對象。
⑥ Java中多線程在多核CPU中是真的同時執行嗎
如果是單核CPU,在某個時間點只能執行一個線程,但是多核CPU你可以理解為多個單核CPU,當然可以同時執行多個線程啦。
⑦ java多核多線程
java可以實現多線程.
但是不能判斷某個線程再哪個CPU上執行.
java實現多線程有兩種方法。
一種是繼承Thread類
class MyThread extends Thread{
@override
public void run(){
//要執行的代碼
}
}
調用時,使用new MyThread().start()就可以了
另一種方法是實現Runnable介面
class MyThread implements Runnable{
@override
public void run(){
//要執行的代碼
}
}
調用方法:
new Thread(new MyThread()).start()
⑧ Java7真的為多核革命做好准備了嗎
Java7真的為多核革命做好准備了嗎???!!!
2008-03-28 14:34 by 資深記者 kyo100900
http://www.iteye.com/news/1686
Henrik Engström【注1】卻不這么認為!在他最近發表的blog中,他強調「新的編程語言在對待多核的問題上,必須內置對多核的支持而不是增加一些像API這樣的特性就能搞定的」。
在Java早期的時候,我們哪裡會知道Java編程模型會受如今洶涌澎湃的並發與多核編程影響。但隨著JVM本身的不斷進化,支持了很多語言,比如說Scala,可以做為並發編程的選擇。如果提升應用程序的性能確實是個問題的話,那麼也許Henrik Engström是對的,他主張I/O和內存管理會是真正的瓶頸,而不是你多加上幾個處理器就可以解決的。他引用了Brian Goetz【注2】的文章《Java理論與實踐:應用fork-join框架》,裡面談到了即將加入到Java7的java.uti.concurrent包里的新框架——fork-join:
「伺服器應用程序通常會運行比可用的處理器數量多很多的並發線程或請求。這是因為在大多數伺服器應用程序中,對請求的處理包含大量 I/O,這些 I/O 不會佔用太多的處理器(所有網路伺服器應用程序都會處理許多的套接字 I/O,因為請求是通過套接字接收的;也會處理大量磁碟(或資料庫)I/O)。如果每個任務的 90% 的時間用來等待 I/O 完成,您將需要 10 倍於處理器數量的並發任務,才能充分利用所有的處理器。隨著處理器數量增加,可能沒有足夠的並發請求保持所有處理器處於繁忙狀態。但是,仍有可能使用並行性來改進另一種性能度量:用戶等待獲取響應的時間。」
這其實迴避了問題的實質,我們想知道如何將所有新加入的處理器為我所用,做為多核革命?
而與此同時Daniel Lemire【注3】發表《計算機編程的多核革命還無法到來》對多核編程持否定態度。實際上他強調的是對大多數大型應用程序來說,最大的性能瓶頸實際上在數據層,而且,很多性能難題是可以通過框架(比如說MapRece和Hadoop)和存儲分區解決的。
總之,Java7勇敢的邁向由多核革命所引導的新的「並行」領域。同時,隨著Microsoft和Intel在這方面的投資(最近兩家公司宣布共投資 2億美元於並行計算.),你會發現洶涌的潮汐即將淹地平線(暗指多核革命的到來)。
【注1】
Henrik Engström從1997年開始一直從事專業軟體開發,精通OOP,設計模式,Java SE/EE,應用伺服器和SOA,精通各個n-層架構。對Jboss,Weblogic,Websphere伺服器有非常深刻的理解。
【注2】
Brian Goetz 作為一名專業軟體開發人員已經 20 年了。他是 Sun Microsystems 的高級工程師,並且效力於多個 JCP 專家組。Brian 的著作 Java Concurrency In Practice 在 2006 年 5 月由 Addison-Wesley 出版。請參閱 Brian 在流行的業界出版物上 已發表和即將發表的文章。
【注3】
加拿大的新不倫瑞克大學教授
⑨ java 如何充分利用多核CPU
用Thread就可以了。系統會自動把Thread分配到不同的核上運行。