1. 程式人生 > >Java併發/多執行緒指南

Java併發/多執行緒指南

在過去,計算機只有一個CPU,並且同一時刻只能執行一個程式。後來出現了多工處理,這意味著計算機可以同時執行多個程式(AKA任務或程序)。然而,它並非真正“在同一時間”。單個CPU在程式之間共享。作業系統將在執行的程式之間切換,在切換之前執行每個程式一段時間。

隨著多工處理出現,軟體開發人員面臨著新的挑戰。程式可能不在假設擁有所有可用的CPU時間,也不能假設所有記憶體或其他計算機資源。一個好的程式應該釋放它不在使用的所有資源,因此其他程式可以使用它們。

後來又出現了多執行緒,這意味著你可以在同一個程式中擁有多個執行執行緒。執行執行緒可以被認為是CPU執行程式。當多個執行緒執行同一程式,就像多個CPU執行在同一個程式中一樣。

多執行緒是提高某些型別程式效能的一個好方法。然而,多執行緒比多工更具挑戰效能。執行緒在同一程式中執行,因此同時讀寫相同記憶體。這可能導致在單執行緒中看不到的錯誤,其中一些錯誤可能在單個CPU機器上看不到,因為兩個執行緒從未真正“同時”執行。但是,現代計算機配備了多核CPU,甚至還有多個CPU。這意味著可以通過單獨的核心或CPU同時執行單獨的執行緒。

如果一個執行緒讀一個記憶體位置同時另一個執行緒正在寫入,那麼第一個執行緒最終會讀到什麼值?舊值?第二個執行緒寫入的值?或者是兩者之間的混合值?或者,如果兩個執行緒同時寫入同一個記憶體位置,當它們寫完時會留下什麼值?第一個執行緒寫入的值?第二個執行緒寫入的值?或者寫入兩個值的混合?

沒有恰當的預防措施,這些結果都有可能。這些行為甚至無法預測,結果可能會不時發生變化。因此,作為開發人員,瞭解如何採取正確的預防措施非常重要,這意味著學習如何控制執行緒訪問共享資源像記憶體、檔案、資料庫等。這是Java併發教程解決的主題之一。

Java是第一批使開發人員可以輕鬆使用多執行緒的語言之一,Java從一開始就具有多執行緒功能。因此,Java開發人員經常面對上述問題。這是我寫這篇關於Java併發文章的原因。作為自己和任何可能從中受益的Java開發人員的筆記。

這篇文章將主要關注Java中的多執行緒,但是多執行緒中出現的一些問題類似於多工處理和分散式系統中出現的問題。因此,在這篇文章中也可能出現對多工處理和分散式系統的引用。因此“併發”一詞而不是“多執行緒”。

自從第一本Java併發書籍編寫以來,甚至自Java5併發實用程式釋出以來,併發體系結構和設計領域發生了很多事情。新的、非同步的“無共享”平臺和API,如Vert.x、Play/Akka和Qbit已經出現。這些平臺使用了不同的併發模型相比標準Java/JEE的併發模型執行緒、共享記憶體和鎖。新的非阻塞併發演算法已經發布,並且我們的工具包中添加了新的非阻塞工具,如LMax Disruptor。Java7 Fork/Join框架以及Java8 中集合流API引入了新的函數語言程式設計並行性。

隨著這些新的開發,我現在是時候更新這個Java Concurrency教程了。因此,本教程再次進行中。只要有時間就會發布新的教程。

個人微信公眾號,歡迎關注。