併發程式設計 基礎篇
阿新 • • 發佈:2019-01-30
參考 : <<Java 併發程式設計的藝術>> -方騰飛 魏鵬 程曉明
無論是單機還是分散式環境,多執行緒無處不在,
如果用人來比作執行緒的話,一個公司不可能只有一個人,一個團隊不可能只有一個人
1.那麼多執行緒一定是快的嗎?
為什麼會有這個疑問?
難道多個人一起來做某件事情效率還比不上一個人嗎?
我們來看 cpu對於多執行緒的處理機制:
cpu通過時間分片法來迴圈執行任務,cpu定好一個固定的時間片,在這個時間片內執行執行緒的任務。如果在時間片內任務未執行完成,則會儲存當前執行緒的狀態,然後切到另外一個任務(執行緒)。 從當前任務在時間片內未執行完成到cpu儲存當前任務狀態,再到切換回這個任務的過程就是一次上下文切換 上下文切換會給cpu帶來一定效率上的損失,影響多執行緒的執行速度
回到問題1,書中給出的demo只是對數字進行累加。
得出結論
百萬次以下的操作中,併發執行速度回比序列執行累加的速度慢。
相對於累加這種比較簡易的操作,實際專案中執行緒中執行的任務可能更加複雜,查詢,排序,通訊之類,這種情況多執行緒一般會更加快速
2.如何減少上下文切換?
- 無鎖併發程式設計
- CAS演算法
- 使用最少執行緒
- 協程,在單執行緒裡實現多工的排程,並在單執行緒裡維持多個任務間的切換