**:
目錄(?)
[+] 問題一上下文切換會帶來額外的開銷
執行緒的執行機制
什麼是上下文切換
上下文切換的過程
上下文切換是有開銷的
如何減少上下文切換
問題二併發不當可能會產生死鎖
什麼是死鎖
死鎖示例
如何避免死鎖
問題三計算機資源會限制併發
誤區執行緒越多速度越快
什麼是資源
如何解決資源的限制
併發是為了提公升程式的執行速度,但並不是多執行緒一定比單執行緒高效,而且併發程式設計容易出錯。若要實現正確且高效的併發,就要在開發過程中時刻注意以下三個問題:
接下來會逐一分析這三個問題,並給出相應的解決方案。
當一條執行緒的時間片用完後,作業系統會暫停該執行緒,並儲存該執行緒相應的資訊,然後再隨機選擇一條新執行緒去執行,這個過程就稱為「執行緒的上下文切換」。
每次進行上下文切換時都需要儲存當前執行緒的執行狀態,並載入新執行緒先前的狀態。
如果上下文切換頻繁,cpu花在上下文切換上的時間佔比就會上公升,而真正處理任務的時間佔比就會下降。
因此,為了提高併發程式的執行效率,讓cpu把時間花在刀刃上,我們需要減少上下文切換的次數。
當多個執行緒相互等待已經被對方占用的資源時,就會產生死鎖。
class
deadlock }}
}).start();
// 第二條執行緒
thread t2 = new
thread(new
runnable()}}
}).start();
}
在併發程式設計中,並不是執行緒越多越好,有時候執行緒多了反而會拉低執行效率,原因如下:
說了這麼多隻想告訴你乙個道理:執行緒並不是越多越好,要根據當前計算機所能提供的資源考慮。
資源分為硬體資源和軟體資源:
軟體資源
十一 併發程式設計
子go程 func sing i int 子go程 func dance i int 主go程 func main 主go程結束,子go程隨之退出。所以這裡要睡10秒等子go程執行完畢,不然看不見子go程列印輸出。time.sleep 10 time.second 1.1runtime包 len c...
併發程式設計的藝術(一) 併發程式設計的挑戰
含義 cpu通過給每個執行緒分配cpu時間片實現多執行緒執行 當前任務執行乙個時間片後會切換下乙個任務,但切換前會儲存上乙個任務的狀態,從儲存到載入的過程就是一次上下文切換。但執行緒會有建立和上下文切換的開銷,所以多執行緒不一定快。減少上下文切換方法 無鎖併發程式設計 如id按hash演算法取模,不...
Java併發程式設計一
不要用run 來開啟執行緒,它只會在當前執行緒中,序列執行run 方法中的 建立執行緒時,推薦傳入runnable介面的例項,因為預設的thread.run 就是直接呼叫內部的runnable介面,這樣避免了過載thread.run 因此使用runnable介面來告訴執行緒該做什麼更為合理。publ...