java併發程式設計(一) 併發程式設計需要注意問題

2021-08-01 03:56:06 字數 954 閱讀 5237

**:

目錄(?)

[+] 問題一上下文切換會帶來額外的開銷

執行緒的執行機制

什麼是上下文切換

上下文切換的過程

上下文切換是有開銷的

如何減少上下文切換

問題二併發不當可能會產生死鎖

什麼是死鎖

死鎖示例

如何避免死鎖

問題三計算機資源會限制併發

誤區執行緒越多速度越快

什麼是資源

如何解決資源的限制

併發是為了提公升程式的執行速度,但並不是多執行緒一定比單執行緒高效,而且併發程式設計容易出錯。若要實現正確且高效的併發,就要在開發過程中時刻注意以下三個問題:

接下來會逐一分析這三個問題,並給出相應的解決方案。

當一條執行緒的時間片用完後,作業系統會暫停該執行緒,並儲存該執行緒相應的資訊,然後再隨機選擇一條新執行緒去執行,這個過程就稱為「執行緒的上下文切換」。

每次進行上下文切換時都需要儲存當前執行緒的執行狀態,並載入新執行緒先前的狀態。

如果上下文切換頻繁,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...