死鎖是指兩個或兩個以上的程序在執行過程中,由於競爭資源或者由於彼此通訊而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。產生死鎖的原因,主要包括:
如果系統資源充足,程序的資源請求都能夠得到滿足,那麼死鎖出現的可能性就很低;否則, 就會因爭奪有限的資源而陷入死鎖。其次,程式執行的順序與速度不同,也可能產生死鎖。產生死鎖的四個必要條件:
這四個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立,而只要上述條件之一不滿足,就不會發生死鎖。
如何解決死鎖?
理解了死鎖的原因,尤其是產生死鎖的四個必要條件,我們就可以最大可能地避免、預防和解除死鎖。所以,在系統設計、程序排程等方面注意如何不讓這四個必要條件成立,如何確定資源的合理分配演算法,避免程序永久佔據系統資源,這就是避免、預防和解決死鎖的最佳實踐。此外,也要防止程序在處於等待狀態的情況下占用資源。因此,對資源的分配要給予合理的規劃。
用下面一段死鎖的**來理解吧
public class deadlock } } } catch (exception e) }); thread threadb = new thread(() -> } } } catch (exception e) }); threada.start(); threadb.start(); } }
如上述**所示,我們啟動了兩個執行緒,在每個執行緒中都要獲得deadlock.lock_1和deadlock.lock_2,其中
這樣,當threada獲取到deadlock.lock_1之後,就要去獲取deadlock.lock_2,而deadlock.lock_2則是先被threadb獲取了,因此threada就需要等待threadb釋放deadlock.lock_2之後才能繼續執行;但是threadb在獲取到deadlock.lock_2之後,卻是在等待threada釋放deadlock.lock_1,因此這就形成了「迴圈等待條件」,從而形成了死鎖。想要解決這個死鎖很簡單,我們只需要讓threada和threadb獲取deadlock.lock_1和deadlock.lock_2的順序相同即可,例如:
public class deadlock } } } catch (exception e) }); thread threadb = new thread(() -> } } } catch (exception e) }); threada.start(); threadb.start(); } }
除此之外,還有一種解決方法,那就是讓deadlock.lock_1和deadlock.lock_2的值相同,例如:
public static final string lock_1 = "lock"; public static final string lock_2 = "lock";
這是為什麼呢?因為字串有乙個常量池,如果不同的執行緒持有的鎖是具有相同字元的字串鎖時,那麼兩個鎖實際上就是同乙個鎖。
為什麼產生死鎖和如何解決死鎖
為什麼產生死鎖和如何解決死鎖 過多的同步可能造成相互不釋放資源,而導致的相互等待 同步中持有多個物件的鎖 解決方案是不要在同乙個 塊中,同時持有多個物件的鎖 package cn.com.state public class testdeadlock class lipstick class mir...
什麼是程序死鎖,如何解決?
所謂死鎖 是指兩個或兩個以上的程序在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。由於資源占用是互斥的,當某個程序提出申請資源後,使得有關程序在無外力協助下,永遠分配不到必需的資源而...
什麼是執行緒鎖,什麼是死鎖,解決死鎖的辦法。
死鎖 指兩個或兩個以上的程序在執行過程中,由於競爭資源或者由於彼此通訊而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去 死鎖的條件 死鎖的四個必要條件 在計算機專業的本科教材中,通常都會介紹死鎖的四個必要條件。這四個條件缺一不可,或者說只要破壞了其中任何乙個條件,死鎖就不可能發生。我們來複...