作者:Jakob Jenkov 譯者:Simon-SZ 校對:方騰飛
http://tutorials.jenkov.com/java-concurrency/index.html
在過去單CPU時代,單任務在一個時間點只能執行單一程式。之後發展到多工階段,計算機能在同一時間點並行執行多工或多程式。雖然並不是真正意義上的“同一時間點”,而是多個任務或程式共享一個CPU,並交由作業系統來完成多工間對CPU的執行切換,以使得每個任務都有機會獲得一定的時間片執行。
隨著多工對軟體開發者帶來的新挑戰,程式不在能假設獨佔所有的CPU時間、所有的記憶體和其他計算機資源。一個好的程式榜樣是在其不再使用這些資源時對其進行釋放,以使得其他程式能有機會使用這些資源。
再後來發展到多執行緒技術,使得在一個程式內部能擁有多個執行緒並行執行。一個執行緒的執行可以被認為是一個CPU在執行該程式。當一個程式執行在多執行緒下,就好像有多個CPU在同時執行該程式。
多執行緒比多工更加有挑戰。多執行緒是在同一個程式內部並行執行,因此會對相同的記憶體空間進行併發讀寫操作。這可能是在單執行緒程式中從來不會遇到的問題。其中的一些錯誤也未必會在單CPU機器上出現,因為兩個執行緒從來不會得到真正的並行執行。然而,更現代的計算機伴隨著多核CPU的出現,也就意味著不同的執行緒能被不同的CPU核得到真正意義的並行執行。
如果一個執行緒在讀一個記憶體時,另一個執行緒正向該記憶體進行寫操作,那進行讀操作的那個執行緒將獲得什麼結果呢?是寫操作之前舊的值?還是寫操作成功之後的新值?或是一半新一半舊的值?或者,如果是兩個執行緒同時寫同一個記憶體,在操作完成後將會是什麼結果呢?是第一個執行緒寫入的值?還是第二個執行緒寫入的值?還是兩個執行緒寫入的一個混合值?因此如沒有合適的預防措施,任何結果都是可能的。而且這種行為的發生甚至不能預測,所以結果也是不確定性的。
Java的多執行緒和併發性
Java是最先支援多執行緒的開發的語言之一,Java從一開始就支援了多執行緒能力,因此Java開發者能常遇到上面描述的問題場景。這也是我想為Java併發技術而寫這篇系列的原因。作為對自己的筆記,和對其他Java開發的追隨者都可獲益的。
該系列主要關注Java多執行緒,但有些在多執行緒中出現的問題會和多工以及分散式系統中出現的存在類似,因此該系列會將多工和分散式系統方面作為參考,所以叫法上稱為“併發性”,而不是“多執行緒”。
原創文章,轉載請註明: 轉載自併發程式設計網 – ifeve.com
本文連結地址: Java併發性和多執行緒介紹