JAVA 併發之路(一)

望舒喜歡夏天發表於2018-01-10

執行緒與程式

程式

作業系統的出現使得計算機每次能夠執行多個程式,並且不同的程式都在單獨的程式中執行。作業系統為各個獨立執行的程式分配各種資源,包括記憶體,檔案控制程式碼以及安全證照等。 不同的程式之間可以通過一些粗粒度的通訊機制來交換資料,例如套接字,共享記憶體,檔案等。

之所以加入程式來實現多個程式的同時執行,主要基於:資源利用率,公平性和便利性。這些原因也同時催生著執行緒的出現。

執行緒

執行緒允許在同一個程式中同時存在多個程式控制流,通常每一個任務稱為一個執行緒。執行緒會共享程式範圍內的資源,比如記憶體控制程式碼,檔案控制程式碼。但是每個執行緒有各自的程式計數器,棧以及區域性變數等。執行緒還提供了一種直觀的分解模式來充分利用多處理器系統中的硬體並行性,而在同一個程式中的多個執行緒也可以被同時排程到多個CPU上執行。 執行緒也可以稱為輕量級程式,建立,撤銷一個執行緒比啟動一個新程式的開銷要小得多。由於同一個程式中的所有執行緒都將共享程式的記憶體地址空間,因此這些執行緒都能訪問相同的變數並且在同一個堆上分配物件,這就需要實現一種比在程式間共享資料粒度更細的資料共享機制。

執行緒的優勢:

  1. 降低程式開發和維護成本
  2. 提升複雜應用程式的效能
  3. 降低程式碼的複雜度 例如:在GUI中,可提高使用者介面靈敏度;在伺服器應用程式中,可以提升資源利用率和系統吞吐率;還可以簡化JVM的實現。

通過使用執行緒,可以將複雜並且非同步的工作流進一步分解為一組簡單並且同步的工作流,每個工作流在一個單獨的執行緒中執行,並在特定的同步位置進行互動。

執行緒的風險:

  1. 安全性問題: 在沒有充足同步的情況下,多個執行緒的執行順序是不可預測的,甚至會產生奇怪的結果。要使多執行緒程式的行為可以預測,必須對共享變數的訪問操作進行協同,這樣才不會線上程之間發生彼此干擾。
  2. 活躍性問題: 活躍性關注另一個目標,即“某件正確的事情最終會發生”, 比如死鎖,飢餓,活鎖。
  3. 效能問題: 活躍性意味著某件正確的事情最終會發生,但卻不夠好,因為通常希望正確的事情儘快發生。比如同步機制通常會帶來額外的效能開銷。

執行緒無處不在

幾乎所有的Java應用程式都是多執行緒的,即便在程式中沒有顯示的建立執行緒,但在框架中仍可能會建立執行緒,因此在這些執行緒中呼叫的程式碼同樣必須是執行緒安全的。 執行緒安全性需求具有延伸性,因為當某個框架在程式中引入併發性時,框架本身會回撥應用程式的程式碼,而這些程式碼會訪問應用程式的狀態,所以所有訪問這些狀態的程式碼路徑都必須是執行緒安全的。

相關文章