面試問題之執行緒同步和死鎖

2021-06-24 11:47:11 字數 894 閱讀 8713

互斥(mutual exclusion):存在這樣一種資源,它在某個時刻只能被分配給乙個執行緒(也稱為執行緒)使用;

持有(hold and wait):當請求的資源已被占用從而導致執行緒阻塞時,資源占用者不但無需釋放該資源,而且還可以繼續請求更多資源;

不可剝奪(no preemption):執行緒獲得到的互斥資源不可被強行剝奪,換句話說,只有資源占用者自己才能釋放資源;

環形等待(circular wait):若干執行緒以不同的次序獲取互斥資源,從而形成環形等待的局面,想象在由多個執行緒組成的環形鏈中,每個執行緒都在等待下乙個執行緒釋放它持有的資源。

不難看出,在死鎖的四個必要條件中,第

二、三和四項條件比較容易消除。通過引入事務機制,往往可以消除第

二、三兩項條件,方法是將所有上鎖操作均作為事務對待,一旦開始上鎖,即確保全部操作均可回退,同時通過鎖管理器檢測死鎖,並剝奪資源(回退事務)。這種做法有時會造成較大開銷,而且也需要對上鎖模式進行較多改動。

消除第四項條件是比較容易且代價較低的辦法。具體來說這種方法約定:上鎖的順序必須一致。具體來說,我們人為地給鎖指定一種類似「水位」的方向性屬性。無論已持有任何鎖,該執行緒所有的上鎖操作,必須按照一致的先後順序從低到高(或從高到低)進行,且在乙個系統中,只允許使用一種先後次序。

當多個執行緒需要相同的一些鎖,但是按照不同的順序加鎖,死鎖就很容易發生。如果能確保所有的執行緒都是按照相同的順序獲得鎖,那麼死鎖就不會發生。

另外乙個可以避免死鎖的方法是在嘗試獲取鎖的時候加乙個超時時間,這也就意味著在嘗試獲取鎖的過程中若超過了這個時限該執行緒則放棄對該鎖請求。若乙個執行緒沒有在給定的時限內成功獲得所有需要的鎖,則會進行回退並釋放所有已經獲得的鎖,然後等待一段隨機的時間再重試。這段隨機的等待時間讓其它執行緒有機會嘗試獲取相同的這些鎖,並且讓該應用在沒有獲得鎖的時候可以繼續執行。

執行緒同步和死鎖問題

死鎖的形成 死鎖的避免 加鎖順序 執行緒按一定順序加鎖,若所有執行緒都按相同順序獲得鎖,就能避免死鎖 加鎖時限 執行緒獲取鎖時加上時限,超時則放棄並釋放所占有的鎖,就能避免死鎖 死鎖檢測 乙個更優的預防機制,主要針對不可能實現按序加鎖和加鎖時限的場景 每當乙個執行緒獲得了鎖,便在相關的資料結構中 m...

執行緒的同步和死鎖

同步與死鎖 需要了解 什麼情況下需要同步 實現資料共享的時候 同步怎麼實現 同步 塊或者同步方法解決 實現同步了有什麼弊端 效能和效率會降低 publicclass syncdemo1 publicclassthreaddemo02 classmyrunnable1implements runnab...

關於面試問到死鎖的問題

什麼是死鎖 就是在多執行緒的執行中,當乙個執行緒需要獲取到鎖時才能繼續往下執行,如果沒有立即獲取到鎖它是會進入等待狀態的。那麼假設如果執行緒1獲持有著a鎖之後它還想獲取b鎖,但是b鎖被執行緒2所持有,所以執行緒1要進入等待狀態。但是剛好執行緒2想獲取a鎖,被執行緒1所持有,那麼執行緒2也進入等待狀態...