1. 程式人生 > >Java併發程式設計(一)------併發程式設計面臨的問題

Java併發程式設計(一)------併發程式設計面臨的問題

1. 併發程式設計面臨的問題

併發程式設計是為了讓程式執行得更快,但是並不是啟動更多的執行緒就能讓程式最大限度的併發執行,通常在併發程式設計中會遇到下面的問題.

1.1 上下文切換

CPU通過時間片非配演算法來迴圈執行任務,當前任務執行一個時間片後會切換到下一個任務.在切換時會儲存上一個任務的狀態,以便這個任務再次執行時,可以在載入這個任務的狀態.所以任務從儲存到再載入的過程就是一次上下文切換.

1.1.1 多執行緒不一定比單執行緒快

測試多執行緒是否一定比單執行緒快 執行連結中的程式碼發現,當併發操作較少時,併發執行的速度比序列慢,因為併發執行時,執行緒有建立和上下文切換的開銷.

1.1.2 如何減少上下文切換

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

1.2 死鎖

造成死鎖的程式碼 連結中的程式碼會造成死鎖,程式碼中thread1和thread2互相等待對方釋放鎖.避免死鎖的方法如下:

  • 避免一個執行緒同時獲取多個鎖
  • 避免一個執行緒在鎖內同時佔用多個資源,儘量保證每個鎖只佔用一個資源
  • 嘗試使用定時鎖
  • 對於資料庫鎖,加鎖和解鎖必須在一個連線裡,否則可能解鎖失敗.

1.3 資源限制

程式的執行速度受限於計算機的硬體或軟體資源.硬體限制有頻寬的上傳/下載速度,硬碟讀寫和CPU的處理速度;軟體限制有資料庫的連線數和socket的連線數等.
為了解決資源限制,硬體可以換裝置,採用叢集併發執行程式;
軟體限制可以使用連線池將資料庫和socket連線複用.