關於面試問到死鎖的問題

2021-10-08 19:39:27 字數 1374 閱讀 5108

什麼是死鎖:就是在多執行緒的執行中,當乙個執行緒需要獲取到鎖時才能繼續往下執行,如果沒有立即獲取到鎖它是會進入等待狀態的。

那麼假設如果執行緒1獲持有著a鎖之後它還想獲取b鎖,但是b鎖被執行緒2所持有,所以執行緒1要進入等待狀態。但是剛好執行緒2想獲取a鎖,被執行緒1所持有,那麼執行緒2也進入等待狀態。(這樣說雖然繞但好理解)

兩個執行緒一直處於等待狀態,形成死鎖

產生死鎖的原因

1、兩個執行緒競爭了不可剝奪的資源

2、程序執行的推進順序不合適(講這話就很沒良心)

舉個例子:比如上面的執行緒1拿到了a鎖,執行緒2拿到了b鎖。因為這兩個執行緒再向前推進就會發生死鎖了

死鎖產生的必要條件

1、互斥:就是在一段時間內某資源僅為乙個執行緒所占用

2、請求和保持條件:就是你想請求別的鎖b,但是你手裡的鎖a一直抓住不放開

3、不剝奪條件:就是我在拿著鎖a用的時候,在我沒用完之前是不能剝奪的,用完我自己會釋放

4、環路等待條件:(不想解釋了,感覺記了也沒啥用)

class

test

implements

runnable

public

void

run()}

}else}}

}}class

mylock

//兩個鎖,用來製造死鎖

class

deadlock

}

1、確定順序來獲得鎖。

如果你乙個執行緒要獲取多個鎖,就需要充分考慮不同執行緒獲得鎖的順序

例如:執行緒1獲取a鎖再嘗試獲取b鎖,那此時執行緒2先獲取b鎖再嘗試獲取a鎖。a鎖被1拿著,b鎖被2拿著,顯然不合理(看圖就知道我說啥了)

這裡,獲取鎖只要按照特定的順序獲取即可避免死鎖。

針對兩個鎖的情況,可以用鎖物件的hashcode值大小來按順序獲取鎖。

但是如果此時有多個鎖,用hashcode排序是不行的,需要使用銀行家演算法,這樣所有的鎖都按照特定順序排。(銀行家演算法,我也不懂,再慢慢學是什麼東西)

2、超時放棄 就是其中乙個執行緒選擇把之前抱住的鎖釋放掉吧。這樣就不會一直尷尬下去了。 sychronized是只要執行緒沒有獲得鎖,就一直等下去(太固執了) 而lock介面提供的boolean trylock方法可以設定固定時長等待鎖,沒有獲得鎖,好我等,等的時間太長了,那我就把之前抱住的鎖都釋放掉吧。上面說的兩種策略其實會損害系統的效能。避免死鎖最典型的還是銀行家演算法

可能問到的面試問題

寫在前面 最近總在找工作和被找工作糾纏著,由於各種因素的影響,想去的公司去不了,能去的公司不了解,我想,這到了我該做出抉擇的時刻了!生活中需要做選擇的地方太多了,要綜合各方面的因素,結合自身興趣,選擇乙個最合適的!grab every chance.1 請你自我介紹一下自己好嗎?2 你覺得你個性上最...

面試反覆被問到的問題 高頻面試問題

方法1 寬度高度已知 父元素相對定位,子元素絕對定位,left 50 top 50 margin left 負的寬度一半 margin top 負的高度一板 方法二 flex布局,寬度高度已知 在父元素身上 display flex justify content center align item...

關於面試問題

記錄下今天面試被問到印象中的面試題 第一道題 如下 找出當前小於10的和 var a 2,3,4,20,30,60,9,8 解答 var b 0 for var i 0 i console.log b 第二道題 如下 解構復值,獲取a和d的值 var obj c 4 解答 let obj conso...