面試官 死鎖是什麼?它是怎麼產生的?如何避免?

2021-10-21 14:55:47 字數 1827 閱讀 3762

死鎖就是有兩個或者多個程序由於競爭資源而造成阻塞的現象,如果無外力作用,這種局面就會一直持續下去。

案例:兩個人共享紅藍鑰匙,都要執行獲取鑰匙,開啟兩扇門,最後歸還鑰匙的操作。如下圖這樣就會導致死鎖:

死鎖產生必須滿足四個必要條件:

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...

不懂面試官想要什麼,面試怎麼可能成功?

面試有成功必定會有失敗,失敗並不可怕,可怕的是總是在同一地方栽跟頭。因此總結失敗的原因變得很重要,在筆者看來,很多面試失敗的關鍵點在於沒有搞懂面試官想要什麼。如果我們把面試看成是一場對自己的銷售過程,那麼面試官就是有招聘需求的客戶,而我們自己就是面試官的銷售顧問,面試的失敗其本質就是我們沒有讓面試官...