JAVA併發1:併發編程的挑戰

上下文切換

一個CPU同一時刻只能執行一個線程;CPU 經過給每一個線程分配必定的時間片,時間片很是短,一般是幾十毫秒,來不停的切換線程執行任務,達到了多線程的效果。當線程用完本身的時間片後,及時任務尚未完成,操做系統也會剝奪它的執行權,讓另外一條線程執行。算法

當一條線程的時間片用完後,操做系統會暫停該線程,並保存該線程相應的信息(到程序計數器),而後再隨機選擇一條新線程去執行,這個過程稱爲「上下文切換」。因爲進行上下文切換時,須要保存當前線程的狀態,並加載線程先前的狀態,這是有消耗的,所以應該儘可能減小上下文切換的次數。數據庫

減小上下文切換

  • 減小線程的數量,避免建立沒必要要的線程。
  • 採用無鎖併發編程。採用一些辦法避免使用鎖,如將數據ID按照 Hash(id) 進行取模分段,每一個線程處理各自分段的數據,避免使用鎖。
  • 採用 CAS 算法。 Java 的 Atomic 包使用 CAS 算法更新數據,不須要加鎖。
  • 協程。在單線程裏實現多任務調度,並在單線程裏維持多個任務間的切換。

死鎖

當一個線程永遠地持有一個鎖,而且其餘線程都嘗試得到這個鎖,那麼它們將被永遠阻塞。在線程A持有鎖L1並想得到鎖L2的同時,線程B持有鎖L2並想得到L1,那麼這兩個線程將永遠等待下去,也就是產生了死鎖。編程

避免死鎖的幾個常見方法:多線程

  • 避免一個線程同時獲取多個鎖
  • 避免一個線程在鎖內同時佔用多個計算機資源,儘可能保證一個鎖只佔用一個資源。
  • 嘗試使用定時鎖,使用lock.tryLock(timeout)來替代使用內部鎖機制。
  • 對於數據庫鎖,加鎖和解鎖都要保證必須在一個數據庫鏈接裏,不然會出現解鎖失敗的狀況。

資源限制

資源限制是指在進行併發編程時,程序的執行速度受限於計算機的硬件資源或者軟件資源,這些計算機資源限制了程序的併發度。併發

線程多了致使線程的上下文切換增多,資源有限,會產生損耗。操作系統

解決資源限制的方法:.net

  • 對於硬件資源限制,考慮使用集羣並行程序。
  • 對於軟件資源限制,能夠考慮使用資源池對資源進行復用,如線程池和數據庫鏈接池。

參考資料

相關文章
相關標籤/搜索