談到死鎖,相信大家都不陌生,耳熟能詳了吧,這個死鎖無論是在學習中、還是面試中都是必說的一個問題。小編先佔用大家時間說下什麼是死鎖?死鎖是指兩個或兩個以上的線程在執行過程中,由於競爭資源或者由於彼此通信而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程稱為死鎖進程。舉個例子:如2個廚師做飯,徐師傅需要醬油,張師傅需要醋,此時呢,徐師傅在拿著醋,張師傅在拿著醬油,2個人就等著對方誰先放下手裡這個東西。一直不放就會一直等下去。
這樣就造成死鎖了,程序進行不下去了。
死鎖的發生必須滿足以下四個條件:
互斥條件:一個資源每次只能被一個進程使用。請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。不剝奪條件:進程已獲得的資源,在末使用完之前,不能強行剝奪。循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關係。
避免死鎖最簡單的方法就是阻止循環等待條件,將系統中所有的資源設置標誌位、排序,規定所有的進程申請資源必須以一定的順序(升序或降序)做操作來避免死鎖。小編這裡拿調整鎖的範圍來避免死鎖
除了死鎖還有一種情況就是活鎖,這個可能大家不是經常被問到,活鎖和死鎖類似,不同之處在於處於活鎖的線程或進程的狀態是不斷改變的,活鎖可以認為是一種特殊的飢餓。一個現實的活鎖例子是兩個人在狹小的走廊碰到,兩個人都試著避讓對方好讓彼此通過,但是因為避讓的方向都一樣導致最後誰都不能通過走廊。簡單的說就是,活鎖和死鎖的主要區別是前者進程的狀態可以改變但是卻不能繼續執行。這裡在拿張師傅和徐師傅為例,比如張師傅和徐師傅都要進廚房做飯,正趕上做飯點,張師傅認為徐師傅應該先做,徐師傅任務張師傅先做,就這樣來回謙讓,最後誰也沒做。
活鎖發生的條件:
1、消息重試。當某個消息處理失敗的時候,一直重試,但重試由於某種原因,比如消息格式不對,導致解析失敗,而它又被重試,這種時候一般是將不可修復的錯誤不要重試,或者是重試次數限定。
2、相互協作的線程彼此響應從而修改自己狀態,導致無法執行下去。比如兩個很有禮貌的人在同一條路上相遇,彼此給對方讓路,但是又在同一條路上遇到了。互相之間反覆地避讓下去,這種時候可以選擇一個隨機退讓,使得具備一定的隨機性。