1. 程式人生 > >併發程式設計 基礎篇

併發程式設計 基礎篇

參考 : <<Java 併發程式設計的藝術>> -方騰飛 魏鵬 程曉明

無論是單機還是分散式環境,多執行緒無處不在,
如果用人來比作執行緒的話,一個公司不可能只有一個人,一個團隊不可能只有一個人
1.那麼多執行緒一定是快的嗎?
為什麼會有這個疑問?
難道多個人一起來做某件事情效率還比不上一個人嗎?
我們來看 cpu對於多執行緒的處理機制:

cpu通過時間分片法來迴圈執行任務,cpu定好一個固定的時間片,在這個時間片內執行執行緒的任務。如果在時間片內任務未執行完成,則會儲存當前執行緒的狀態,然後切到另外一個任務(執行緒)。
從當前任務在時間片內未執行完成到cpu儲存當前任務狀態,再到切換回這個任務的過程就是一次上下文切換
上下文切換會給cpu帶來一定效率上的損失,影響多執行緒的執行速度

回到問題1,書中給出的demo只是對數字進行累加。
得出結論

百萬次以下的操作中,併發執行速度回比序列執行累加的速度慢。

相對於累加這種比較簡易的操作,實際專案中執行緒中執行的任務可能更加複雜,查詢,排序,通訊之類,這種情況多執行緒一般會更加快速

2.如何減少上下文切換?

  • 無鎖併發程式設計
  • CAS演算法
  • 使用最少執行緒
  • 協程,在單執行緒裡實現多工的排程,並在單執行緒裡維持多個任務間的切換