想當年一台電腦只有一個CPU,並且一次只能處理一個程式的能力。後來多工處理出現了,這意味著電腦可以同時處理多個程式了。雖然它不是真正的「同時」。單獨的CPU在程式之間被共用。作業系統將會在運行中的程式進行切換,在切換之前執行一會他們中的一個。
伴隨著多工處理的到來,對軟體開發者來說是一個新的挑戰。程式不能去假設所有的CPU一直都是可用的了,或是所有的記憶體以及其他的電腦資源。一個好的程式應該釋放所有它不再使用的資源,以至於其他的程式可以使用它們。
後來多執行緒出現了,這表示你在相同的程式中可以執行多個執行緒。一個執行緒可以認為是一個CPU在執行一個程式。當你有多個執行緒執行在相同的程式中時,就像是有多個CPU執行在相同的程式中。
多執行緒可以是一個很好的方式去增加一些類型程式的效能。然而,多執行緒相對於多任務來說,甚至是一個更大的挑戰。這個線程正在執行在相同的程式中,一次同時讀取和寫入相同的記憶體。這個就可能導致在單線程中沒有見過的錯誤。這些錯誤中的一些在單CPU機器中可能沒有見過,因為兩個執行緒從來不會同時執行。現代的計算機,都是多核心CPU,甚至也會有多種的CPU。這就意味著分開的線程可以同時被分開的核或CPU去執行。
如果一個執行緒讀一個記憶體單元,而另一個執行緒寫他的時候,第一個執行緒將會以讀到什麼值結束?這個老的值?還是被第二個線程寫的值?還是這兩個之間的混合值?或者如果兩個執行緒同時寫相同的記憶體單元,當他們完成的時候什麼值會留下呢?透過第一個線程寫的值?透過第二個線程寫的值?還是一個混合的值呢?
沒有合適的防範,這些輸出中的任何一個都有可能。這個運行狀況甚至是不可預測的。這個輸出結果可能隨時會改變。因此作為一個開發者知道如何使用正確的防範是重要的----這個意味著需要學會控制線程如何訪問共享資源,像內存,文件,數據庫等等。那個就是這個java並發教學主題中的一個。
Java中的多執行緒與並發
#Java對開發者來說是第一個讓多執行緒簡單易用的語言。 Java從最開始就有多執行緒功能。因此,Java開發者會經常面對上面所描述的問題。這個就是我為什麼寫關於Java並發的系列文章。正如對我自己來說,任何Java開發的夥伴都可能會從它中得到益處。
這一系列將會主要是關於Java多執行緒的,但是發生在多執行緒中的一些問題,跟發生在多工處理和分散式系統中的一些問題是相似的。在這一系列中也可能會提及到多工處理和分散式系統。因此這個字「並發」不只是多執行緒。
在2015年的Java並發以及未來
#自從第一本Java並發書籍被寫,在Java並發框架和設計的世界裡已經發生了很多的事情了,甚至自從Java5並發工具被發布了之後。
新的,非同步的「無共享」的平台和API,像Vert.x和Play / Akka以及Qbit已經應運而生了。這些平台相對於標準的Java線程,共享記憶體和鎖的並發模型,使用了不同的並發模型。新的非堵塞並發演算法已經發布了,並且新的非堵塞並發工具,像LMAX Disrupter已經添加到我們的工具包裡面了。
伴隨著這些新的進展,也是我更新Java並發教學的時間。因此,這個教程再一次處在修改中。只要有時間寫他們,新的教學就會被發布。
以上就是1.Java並發/多執行緒介紹的內容,更多相關內容請關注PHP中文網(www.php.cn)!