在進行併發程式設計開發時,會面臨一些挑戰,主要包括三個方面 :上下文切換、死鎖、資源限制
挑戰一:上下文切換的挑戰
上下文切換: 單個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...