1. 程式人生 > >什麼是死鎖、導致死鎖的原因,活鎖、飢餓又是什麼?

什麼是死鎖、導致死鎖的原因,活鎖、飢餓又是什麼?

死鎖

       是指兩個或兩個以上的程序(或執行緒)在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。

       一個執行緒先獲取from鎖,另一個先獲取to鎖(在獲取兩個鎖的程式碼之間可以加上sleep)

死鎖條件:有一個條件不成立,則不會產生死鎖

1.互斥等待(有鎖):一個資源一次只能被一個程序使用

2.持有鎖並等待鎖:一個程序因請求資源而阻塞時,對已獲得的資源保持不放

3.迴圈等待:若干程序之間形成一種頭尾相接的環形等待資源關係

4.無法剝奪的等待(有些鎖有超時功能):程序獲得的資源,在未完全使用完之前,不能強行剝奪

解決死鎖只需要破除其中一個條件即可

  1. 破除互斥等待(一般沒法破除)
  2. 破除持有並等待(一次性獲取所有資源):拿一個鎖並嘗試拿第二個鎖,拿不到則放掉第一個鎖,等一段時間重新來一遍):程式設計的時候最好就設計好,不然以後更改很麻煩
  3. 破除迴圈等待(按順序獲取資源):比如對於賬戶A、B,他們有ID,規定操作這兩個賬戶的執行緒必須按照ID值的大小獲取,這樣任何執行緒都必須得先獲得A再獲得B,而不是有一個先獲得A,有一個先獲得B(缺點:id並不一定可以用於排序,可能得強制加上一個可以排序的規則,當以後有其他屬性加入,可能引入新的id,這樣又得重新為該屬性分配一個id來排序)
  4. 破除無法剝奪的等待(加入超時):不得已的方法
    ,(缺點:使用者體驗不好,比如使用者轉賬等了半天結果告訴你轉賬失敗)

活鎖

       是指執行緒1可以使用資源,但它很禮貌,讓其他執行緒先使用資源,執行緒2也可以使用資源,但它很紳士,也讓其他執行緒先使用資源。這樣你讓我,我讓你,最後兩個執行緒都無法使用資源。

飢餓

       類似於非公平鎖機制,多個執行緒在等待資源的時候,有一個很早就在等待的執行緒一直獲取不到鎖,反而讓後面來的執行緒獲得了鎖