? ? ? ? ? 本系列譯自jakob jenkov的Java并發(fā)多線程教程,個人覺得很有收獲。由于個人水平有限,不對之處還望矯正!
? ? ? ? 在早期,計算機只有一個CPU,同一時刻只能執(zhí)行一個程序,后來有了多任務的說法,多任務是指計算機在同一時刻可以執(zhí)行多個程序,但這并不是真正意義上的同一時刻,單個CPU 被多個程序共用,操作系統(tǒng)會在運行的運行的程序間相互切換。在相互切換之前會短暫的執(zhí)行其中的一個。
? ? ? 隨著多任務的產生,給程序開發(fā)人員帶來了新的挑戰(zhàn)。程序不能再假定擁有所有的CPU 時間,不能再假定它擁有所有的內存空間和計算機的其他資源。一段好的程序應該釋放掉不再使用的資源,以至于其他程序能夠使用這些資源。再此之后又出現(xiàn)了多線程,這意味著在同一程序中可以有多個線程執(zhí)行,一個線程的執(zhí)行可以認為一個CPU在執(zhí)行這段程序,當有多個線程執(zhí)行時可被視作多個CPU 在執(zhí)行這個程序。
? ? ? 多線程被視作可以提升程序性能的一種很好的方式,但是相對于多任務,多線程帶來了更多的挑戰(zhàn)。同一個程序內部多個線程同一時刻執(zhí)行,這就意味著他們同時讀寫內存,這樣就會出現(xiàn)在單線程下不會產生的錯誤,而這些錯誤不會出現(xiàn)在單CPU 的計算機上,因為在單CPU 的計算機上,同一時刻,多個線程并不是真的都在執(zhí)行,現(xiàn)代計算機有多核,甚至于有些計算機擁有多CPU,這就意味著不同的線程可以同時被不同的核或是不同的CPU 執(zhí)行。

如果一個線程從內存區(qū)域讀一個值的時候,另一個線程正在向內存區(qū)域寫這個值的時候,那么讀的線程最終會讀到什么結果呢?原來的值?還是被另一個線程修改后的值呢?如果沒有合適的保證措施,這些值都是有可能讀到的。這種行為不可預知,結果可能隨時都在變。因此,作為一個程序員,對正確對結果的預測是非常重要的!這就意味著程序員要學會怎么去控制線程對諸如內存、文件、數據庫等這些共享資源的訪問。
Java中的多線程和并發(fā)
? Java 是讓程序員很容易實現(xiàn)多線程的語言之一。java 自從開始之初就有多線程的能力,因此java 開發(fā)人員經常面對上面所說的問題。