天天看點

Java 并發/多線程教程(一) Java中的多線程和并發

         本系列譯自jakob jenkov的Java并發多線程教程,個人覺得很有收獲。由于個人水準有限,不對之處還望矯正!

        在早期,計算機隻有一個CPU,同一時刻隻能執行一個程式,後來有了多任務的說法,多任務是指計算機在同一時刻可以執行多個程式,但這并不是真正意義上的同一時刻,單個CPU 被多個程式共用,作業系統會在運作的運作的程式間互相切換。在互相切換之前會短暫的執行其中的一個。

      随着多任務的産生,給程式開發人員帶來了新的挑戰。程式不能再假定擁有所有的CPU 時間,不能再假定它擁有所有的記憶體空間和計算機的其他資源。一段好的程式應該釋放掉不再使用的資源,以至于其他程式能夠使用這些資源。再此之後又出現了多線程,這意味着在同一程式中可以有多個線程執行,一個線程的執行可以認為一個CPU在執行這段程式,當有多個線程執行時可被視作多個CPU 在執行這個程式。

     多線程被視作可以提升程式性能的一種很好的方式,但是相對于多任務,多線程帶來了更多的挑戰。同一個程式内部多個線程同一時刻執行,這就意味着他們同時讀寫記憶體,這樣就會出現在單線程下不會産生的錯誤,而這些錯誤不會出現在單CPU 的計算機上,因為在單CPU 的計算機上,同一時刻,多個線程并不是真的都在執行,現代計算機有多核,甚至于有些計算機擁有多CPU,這就意味着不同的線程可以同時被不同的核或是不同的CPU 執行。

圖檔發自簡書App

如果一個線程從記憶體區域讀一個值的時候,另一個線程正在向記憶體區域寫這個值的時候,那麼讀的線程最終會讀到什麼結果呢?原來的值?還是被另一個線程修改後的值呢?如果沒有合适的保證措施,這些值都是有可能讀到的。這種行為不可預知,結果可能随時都在變。是以,作為一個程式員,對正确對結果的預測是非常重要的!這就意味着程式員要學會怎麼去控制線程對諸如記憶體、檔案、資料庫等這些共享資源的通路。

  Java 是讓程式員很容易實作多線程的語言之一。java 自從開始之初就有多線程的能力,是以java 開發人員經常面對上面所說的問題。