Part 001: 併發編程面臨的挑戰

併發編程的目的是爲了讓程序執行的更快,而不是啓動更多的線程讓程序最大幅度的併發執行。java

1.上下文切換

CPU經過時間片分配算法來循環執行任務,任務從保存到再加載的過程就是一次上下文切換。 如何減小上下文切換:無鎖併發編程,CAS算法,使用最少線程,協程。 無所併發編程:多線程競爭鎖時,會引發上下文切換。爲了不鎖,如將數據的ID按照Hash算法取模分段,不一樣線程處理不一樣段的數據。 CAS算法:Java的Atomic包使用CAS算法來更新數據,而不須要加鎖。 使用最少線程:避免建立不須要的線程,如任務不多,但建立了許多線程,這樣會致使大量線程處於等待狀態。 協程:在單線程裏實現多任務的調度,並在單線程裏維持多個任務間的切換。 減小上下文切換方法:算法

// 1.將線程信息dump到home/dumpfile/dumpmsg31212文件中
sudo -u admin /opt/software/java/bin/jstack 31212 > /home/dumpfile/dumpmsg31212
// 2.統計全部線程分別處於什麼狀態
grep ava.lang.Thread.State dumpmsg31212 | awk '{print $2$3$4$5}' | sort | uniq -c
// 3.打開dump文件查看處於WAITING的線程在作什麼
// 4.對相關問題進行對應的優化操做

2.死鎖

鎖是應用的比較多的一個工具,運用場景不少,使用也較爲方便,且容易理解。但若是應用不當的話,頗有可能會致使死鎖,致使系統功能沒法正常使用。 形成死鎖的緣由有不少種,大部分狀況下多是出現異常沒有釋放鎖。避免死鎖的常見方法有:數據庫

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

3.資源限制

1.資源限制:指在進行併發編程時,程序的執行速度受限於計算機硬件資源或軟件資源。 2.引起的問題:在併發編程中,代碼執行速度加快的原則是將代碼中串行執行的部分改成並行執行。但若是因爲資源限制,致使併發執行的代碼依舊處於串行執行的狀態,這時程序執行速度不只不會變快,反而會更加緩慢,由於增長了上下文切換和資源調度的時間。 3.如何解決資源限制的問題:硬件資源限制,能夠考慮使用集羣並行執行程序。軟件資源限制,能夠考慮使用資源池將資源複用。 4.資源限制的狀況下進行併發編程時,如何讓程序執行的更快?方法就是根據不一樣的資源限制調整程序的併發度。編程

4.總結

對於Java開發工程師而言,強烈建議多使用JDK併發包提供的併發容器和工具類來解決併發問題。多線程

相關文章
相關標籤/搜索