本文爲轉載學習html
原文連接:http://tutorials.jenkov.com/java-concurrency/index.htmljava
譯文連接:http://ifeve.com/java-concurrency-thread/多線程
在過去單CPU時代,單任務在一個時間點只能執行單一程序。以後發展到多任務階段,計算機能在同一時間點並行執行多任務或多進程。雖然並非真正意義上的「同一時間點」,而是多個任務或進程共享一個CPU,並交由操做系統來完成多任務間對CPU的運行切換,以使得每一個任務都有機會得到必定的時間片運行。併發
隨着多任務對軟件開發者帶來的新挑戰,程序不在能假設獨佔全部的CPU時間、全部的內存和其餘計算機資源。一個好的程序榜樣是在其再也不使用這些資源時對其進行釋放,以使得其餘程序能有機會使用這些資源。分佈式
再後來發展到多線程技術,使得在一個程序內部能擁有多個線程並行執行。一個線程的執行能夠被認爲是一個CPU在執行該程序。當一個程序運行在多線程下,就好像有多個CPU在同時執行該程序。學習
多線程比多任務更加有挑戰。多線程是在同一個程序內部並行執行,所以會對相同的內存空間進行併發讀寫操做。這多是在單線程程序中歷來不會遇到的問題。其中的一些錯誤也未必會在單CPU機器上出現,由於兩個線程歷來不會獲得真正的並行執行。然而,更現代的計算機伴隨着多核CPU的出現,也就意味着不一樣的線程能被不一樣的CPU核獲得真正意義的並行執行。spa
若是一個線程在讀一個內存時,另外一個線程正向該內存進行寫操做,那進行讀操做的那個線程將得到什麼結果呢?是寫操做以前舊的值?仍是寫操做成功以後的新值?或是一半新一半舊的值?或者,若是是兩個線程同時寫同一個內存,在操做完成後將會是什麼結果呢?是第一個線程寫入的值?仍是第二個線程寫入的值?仍是兩個線程寫入的一個混合值?所以如沒有合適的預防措施,任何結果都是可能的。並且這種行爲的發生甚至不能預測,因此結果也是不肯定性的。操作系統
Java的多線程和併發性線程
Java是最早支持多線程的開發的語言之一,Java從一開始就支持了多線程能力,所以Java開發者能常遇到上面描述的問題場景。這也是我想爲Java併發技術而寫這篇系列的緣由。做爲對本身的筆記,和對其餘Java開發的追隨者均可獲益的。htm
該系列主要關注Java多線程,但有些在多線程中出現的問題會和多任務以及分佈式系統中出現的存在相似,所以該系列會將多任務和分佈式系統方面做爲參考,因此叫法上稱爲「併發性」,而不是「多線程」。