死鎖就是有兩個或者多個程序由於競爭資源而造成阻塞的現象,如果無外力作用,這種局面就會一直持續下去。
案例:兩個人共享紅藍鑰匙,都要執行獲取鑰匙,開啟兩扇門,最後歸還鑰匙的操作。如下圖這樣就會導致死鎖:
死鎖產生必須滿足四個必要條件:
1、互斥條件:指在一段時間內某資源只能由乙個程序占用。
只有一副鑰匙2、請求和保持條件:指程序已經保持至少乙個資源,但又提出了新的資源請求,且對自己已獲得的其它資源保持不放。
拿著紅鑰匙的人在沒有歸還紅鑰匙的情況下,又索要藍鑰匙3、不剝奪條件:指程序已獲得的資源,在未使用完之前,不能被剝奪,只能在使用完時由自己釋放。
只要人不主動歸還鑰匙,就可以一直佔著鑰匙4、環路等待條件:指在發生死鎖時,必然存在乙個程序——資源的環形鏈。即程序集合中的p0正在等待乙個p1占用的資源;p1正在等待p2占用的資源,……,pn正在等待已被p0占用的資源。
拿著紅鑰匙的人在等待藍鑰匙,而拿著藍鑰匙的人又在等待紅鑰匙要避免死鎖只要破壞以上四個條件中的任意乙個即可。
我們來看看常見的避免死鎖的方法。
—方法一 . 破壞互斥條件—
只有一副鑰匙,這是形成死鎖的最關鍵的原因。顯然,如果我們能在兩個執行緒跑之前,能給每個執行緒單獨拷貝乙份鑰匙的副本,就能有效的避免死鎖了。
當然,這種方法試用範圍並不廣。因為有時如果系統拷貝那副鑰匙的成本極高,而執行緒又很多的話,這種方法就不適用了。
—方法二.破壞請求和保持條件—
任何乙個執行緒「貪心」,都可能會導致死鎖。大致就是說有了一把鑰匙還沒還就要另一把。這裡我們可以通過規定在任何情況下,乙個執行緒獲取一把鑰匙之後,必須歸還了鑰匙之後才能請求另一把鑰匙,就可以有效解決這個問題。
—方法三.破壞不剝奪條件—
除非執行緒自己還鑰匙,否則執行緒會一直占有鑰匙,是形成不可剝奪條件的原因。這裡,我們可以通過設定乙個」最長占用時間「的閾值來解決這個問題——如果過了10分鐘仍然沒有進入下乙個步驟,則歸還已有的鑰匙。這樣的話,兩個執行緒都能取到所需的鑰匙繼續下去了。
—方法四. 破壞環路等待條件—
會出現死鎖的兩兩組合,一定都是乙個執行緒先取了紅鑰匙而另乙個執行緒先取了藍鑰匙,從而導致了可能形成了「環路等待」。所以我們可以強制規定任何執行緒取鑰匙的順序只能是 「先取藍鑰匙再取紅鑰匙」的話,就能避免死鎖了。(六組解也就只剩下前三組解是有效的了)
面試官 什麼是NIO?NIO的原理是什麼?
首先說一下核心區別 nio是以塊的方式處理資料,但是io是以最基礎的位元組流的形式去寫入和讀出的。所以在效率上的話,肯定是nio效率比io效率會高出很多。nio不在是和io一樣用outputstream和inputstream 輸入流的形式來進行處理資料的,但是又是基於這種流的形式,而是採用了通道和...
面試官 說說快速失敗和安全失敗是什麼
什麼是快速失敗 fail fast 和安全失敗 fail safe 它們又和什麼內容有關係。以上兩點就是這篇文章的內容,廢話不多話,正文請慢用。我們都接觸 hashmap arraylist 這些集合類,這些在 j a.util 包的集合類就都是快速失敗的 而 j a.util.concurrent...
不懂面試官想要什麼,面試怎麼可能成功?
面試有成功必定會有失敗,失敗並不可怕,可怕的是總是在同一地方栽跟頭。因此總結失敗的原因變得很重要,在筆者看來,很多面試失敗的關鍵點在於沒有搞懂面試官想要什麼。如果我們把面試看成是一場對自己的銷售過程,那麼面試官就是有招聘需求的客戶,而我們自己就是面試官的銷售顧問,面試的失敗其本質就是我們沒有讓面試官...