1. 程式人生 > >Java並發編程的挑戰

Java並發編程的挑戰

padding 行程 硬件 使用 啟動 left orm java bsp

並發編程的目的是為了讓程序運行得更快,但是,並不是線程啟動的越多,就能讓程序最大限度地並發執行。並發編程時,會面臨非常多的挑戰,比如上下文切換的問題,死鎖的問題,以及受限於各種硬件和軟件的資源限制問題。

CPU通過時間片分配算法來循環執行任務,當前任務執行一個時間後會切換到下一個任務。但是,在切換前會保存上一個任務的狀態,以便下次切換回這個任務時,可以再加載到這個任務的狀態。從任務保存到再加載的過程就是一次上下文切換。


vmstat 1#vmstat可以測試上下文切換的次數。輸出結果裏的CS(Content Switch)即表示上下文切換的次數。


減少上下文切換的方法有:無鎖並發編程,CAS算法,使用最少線程,使用協程。

使用最少線程:避免創建不需要的線程,比如任務很少,卻創建了很多線程來處理,造成大量線程都處於等待狀態(WAITING)。

協程:在單線程裏實現多任務的調度,並在單線程裏維持多個任務間的切換。


硬件資源限制有帶寬的上傳/下載速度、硬盤讀寫速度和CPU的處理速度。軟件資源限制有數據庫的連接數和socket連接數等。


如何解決資源限制的問題?

  1. 對於硬件限制,可以考慮使用集群並行地執行程序。例如使用Hadoop集群,不同的機器處理不同的數據。可以通過“數據ID%機器數”,計算得到一個機器編號,然後由對應編號的機器處理這筆數據。

  2. 對於軟件限制,可以考慮使用資源池將資源復用。比如使用連接池將數據庫和socket連接復用。





Java並發編程的挑戰