避免死鎖N策

2021-09-22 00:17:06 字數 1227 閱讀 3118

多執行緒的工作的程式總免不了討論死鎖的問題。死鎖的發生需要4個條件:

1.互斥--乙個資源同一時間只能被乙個執行緒所使用

2.請求和保持--乙個執行緒因請求資源而阻塞時,不會釋放原先持有的資源。

3.不剝奪--乙個執行緒不能奪取其它執行緒已搶占的資源

4.迴圈等待

既然已經知道了產生死鎖的原因,我們就可以從這四點入手,得出避免死鎖的幾種方法:

1.不互斥。如果能設計成不互斥,那當然是最好的方案了。其次,可以使用執行緒安全的atomic***類,比如用atomicinteger代替integer或int。使用atomic***類並非高枕無憂,使用它,主要是使用它所提供的一些原子方法來避免使用鎖。僅僅機械地用atomicinteger代替integer是不行的。

2.拒絕等待。比如使用reentrantlock類的trylock方法(c#中也有monitor類的tryenter方法),當一定時間內無法獲得資源時就放棄。一種方案是,當trylock失敗時,釋放自身所有資源,等待隨機的時間後(讓其它執行緒先完成任務並釋放資源)重新嘗試去獲得資源。類似的方案一般都可能產生兩個問題,一是執行緒飢餓(乙個執行緒一直無法獲得全部所需要資源),這樣導致cpu利用率很低。二是活鎖,上面的方案中採用了隨機的等待時間來打亂順序,避免活鎖死迴圈。

3.允許資源搶占。這種方法設計比較複雜,只適用在特定的方案。

4.改變獲取資源的順序。這種方案是並不是按照需要資源的次序來請求資源,問題是導致某些資源被提前鎖定。如以前課程中遇到乙個實驗,n個和尚(分打水的和喝水的),共有3個桶,1口井,還有一口能裝10桶水的缸(其它題目要求略)。如果按需求來鎖定資源,對於每個打水的和尚,順序是

搶占1個桶-搶井-釋放井-搶缸的乙個空位-釋放資源;

對於每個喝水的和尚,順序是

搶桶-搶缸的乙個滿位-釋放資源。

一種死鎖的情況是三個喝水的和尚搶了三個桶,但是缸裡沒水,而打水的和尚因一直在等桶而無法繼續。

我的解決方案是,對於每個打水的和尚,順序是

搶缸的乙個空位-搶1個桶-搶井-釋放資源。

對於喝水的和尚,順序是

搶缸的乙個滿位-搶1個桶-搶井-釋放資源。

對於更簡單一點的情況,可以使用強制固定順序獲得資源來避免死鎖。如果每個執行緒都使用同一順序獲得資源,就不會死鎖,如:

synchronized

(a)  } 

反之,如果某個執行緒採用相反順序獲得資源,就有可能死鎖了

synchronized

(b)  } 

死鎖以及避免死鎖

目錄 一 什麼是死鎖 二 產生死鎖的四個必要條件 三 避免死鎖的方法 是指兩個或兩個以上的程序在執行過程中,由於競爭資源或者由於彼此通訊而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。1.互斥 某種資源一次只允...

如何避免死鎖

如何避免死鎖 1 使用事務時,盡量縮短事務的邏輯處理過程,及早提交或回滾事務 2 設定死鎖超時引數為合理範圍,如 3分鐘 10分種 超過時間,自動放棄本次操作,避免程序懸掛 3 優化程式,檢查並避免死鎖現象出現 4 對所有的指令碼和sp都要仔細測試,在正是版本之前。5 所有的sp都要有錯誤處理 通過...

如何避免死鎖

什麼是死鎖,如何避免死鎖?執行緒a需要資源x,而執行緒b需要資源y,而雙方都掌握有對方所要的資源,這種情況稱為死鎖 deadlock 或死亡擁抱 the deadly embrace 在併發程式設計中,死鎖 deadlock 是一種十分常見的邏輯錯誤。通過採用正確的程式設計方式,死鎖的發生不難避免。...