Java併發程式設計(二)之併發程式設計挑戰篇

2021-09-02 02:40:57 字數 777 閱讀 1907

在進行併發程式設計開發時,會面臨一些挑戰,主要包括三個方面 :上下文切換、死鎖、資源限制

挑戰一:上下文切換的挑戰

上下文切換: 單個cpu同乙個時刻只能執行一條執行緒,作業系統會給每條執行緒分配時間片來對執行緒進行排程操作,執行緒在得到的時間片內占用cpu資源處理自身資料,當作業系統從乙個執行緒切換到另一條執行緒時來執行,需要儲存當前執行緒的執行狀態,以便後續接著執行該執行緒,這就稱為上下文切換;

效能侷限:上下文切換會帶來不必要的執行時間浪費,降低了cpu的執行效率。

解決措施:1、盡量避免建立不必要的執行緒

2、採用compare and swap(比較交換)演算法

3、採用無鎖併發程式設計

4、協程:在單執行緒內實現多執行緒程式設計,並在單執行緒內實現多工切換

挑戰二:死鎖的挑戰

死鎖:當執行緒中出現鎖巢狀使用時,就有可能產生死鎖。

解決措施:

1、 避免一條執行緒中巢狀使用多個鎖;

2、 避免執行緒中的乙個鎖占用多個資源,盡量保證每個鎖只占用乙個資源;

3、 嘗試使用定時鎖 ;

4、 對於資料庫鎖,加鎖和解鎖在同乙個資料庫連線裡面

挑戰三:資源限制的挑戰

當計算機硬體資源和軟體資源有限時,執行緒多了會導致上下文切換增多,cpu花在上下文切換的時間增多後,花在處理任 務上的時間自然就減少了,計算機資源會限制程式的併發度,所以執行緒並不是越多越好,要根據當前計算機所能提供的資源考慮。

解決措施:1、 根據資源限制併發度;

2、 購買計算機硬體資源和軟體資源;

JAVA併發程式設計(二)

一.可見性 讀操作能實時的看到寫操作最新寫入的值。在單執行緒中,讀操作總能得到寫操作寫入的值 但在多執行緒中,如果讀操作跟寫操作在不同的執行緒中執行,那麼讀操作將不一定能適時的看到其他執行緒寫入的值。二.重排序 在沒有使用同步的情況下,編譯器 處理器 執行時都有可能做操作的執行順序進行一些調整。三....

JAVA併發程式設計

通過常量字串 string 來呼叫 wait 或 notify 方法所導致的問題是,jvm 編譯器會在內部自動將內容相同的 string 轉變為相同的物件。這意味著,即便你建立了兩個不同的 mywaitnotify 例項,他們內部的 mymonitorobject 變數也會指向相同的 string ...

Java併發程式設計

執行緒之間通訊 1.加鎖 object.wait 釋放鎖 object.notify 與sychronized 聯合使用,object lock new object sychronized lock sychronized lock 2.改進 無需加鎖並發包下 countdownlatch.awa...