Java多線程死鎖產生的原因及解決方法

  1. 死鎖的定義

    多線程以及多進程改善了系統資源的利用率並提高了系統 的處理能力。然而,併發執行也帶來了新的問題——死鎖。所謂死鎖是指多個線程因競爭資源而造成的一種僵局(互相等待),若無外力作用,這些進程都將無法向前推進。

  2. 死鎖產生的原因

    1. 系統資源的競爭
    2. 進程推進順序非法進程在運行過程中,請求和釋放資源的順序不當,也同樣會導致死鎖。
    3. 信號量使用不當也會造成死鎖。
  3. 死鎖產生的必要條件,產生死鎖必須同時滿足以下四個條件,只要其中任一條件不成立,死鎖就不會發生

    1. 互斥條件:進程要求對所分配的資源進行排他性控制,即在一段時間內一個資源僅爲一個進程所佔有。此時若有其他進程請求該資源,則請求進程只能等待。
    2. 不剝奪條件:進程所獲得的資源在未使用完畢之前,不能被其他進程強行奪走,即只能由獲得該資源的進程自己來釋放
    3. 請求和保持條件:進程已經保持了至少一個資源,但又提出了新的資源請求,而該資源已被其他進程佔有,此時請求進程被阻塞,對自己已獲得的資源保持不放。
    4. 循環等待條件:存在一種進程資源的循環等待鏈,鏈中每一個進程已獲得的資源同時被鏈中下一個進程所請求。
  4. 如何避免死鎖? 在有些情況下死鎖是可以避免的。三種用於避免死鎖的技術:

    1. 加鎖順序(線程按順序加鎖)
    2. 加鎖時限(線程嘗試獲取鎖的時候加上時間,超過時間則放棄對該鎖的請求,並釋放自己佔有的鎖)
    3. 死鎖檢測
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章