1. 程式人生 > >Java併發程式設計(一)——挑戰

Java併發程式設計(一)——挑戰

多執行緒一定會讓程式執行更快嗎?
建立執行緒的問題,上下文切換的問題,死鎖的問題,硬體和軟體資源的問題

上下文切換

即使單核的CPU也是支援多執行緒執行程式碼的,CPU給每個執行緒分配時間片來實現這個機制。
時間片是CPU分配給各個執行緒的時間,非常短,所以CPU通過不停的切換執行緒執行,時間片一般是幾十毫秒。
CPU通過時間片分配演算法來執行任務

  • 使用Lmbench3可以測量上下文切換的時長
  • 使用vmstat可以測量上下文切換的次數
    這裡寫圖片描述
    CS表示上下文切換的次數

減少上下文切換

  • 無鎖併發程式設計
    多執行緒競爭鎖時會引起上下文切換,所以多執行緒處理資料時可以避免鎖,如將資料的ID按照Hash演算法取模分段。
  • CAS演算法
    Java的Atomic包使用CAS演算法來更新資料,不需要加鎖。
  • 使用最少執行緒
    避免建立不需要的執行緒。
  • 協程
    在單執行緒裡實現多工的排程,並在單執行緒裡維持多個任務間的切換。

死鎖

鎖是非常有用的工具,運用場景非常豐富,但是可能會引起死鎖,造成系統功能不可用。

  • 避免一個執行緒同時獲取多個鎖
  • 避免一個執行緒在鎖內同時佔用多個資源,儘量保證每個鎖只佔用一個資源
  • 嘗試使用定時鎖,使用lock.tryLock(timeout)來替代使用內部鎖機制
  • 對於資料庫鎖,加鎖和解鎖必須在一個數據庫連線裡,否則會出現解鎖失敗的情況

資源限制的挑戰

程式執行速度受限與計算機硬體資源和軟體資源。比如說伺服器的網路頻寬時固定了,即使併發也不可能超過這個閥值;另外還有磁碟的讀寫,CPU的處理速度等。

併發程式設計中,將程式碼程式加快的原則是將程式碼中序列執行的變成併發執行,但是如果受限於資源,仍然是序列執行的,那程式不僅不會加快,反而會變慢。

對於硬體資源,可以採用叢集並行執行程式,如ODPS,Hadoop等