17 死鎖是如何產生的

2022-10-10 17:39:13 字數 3626 閱讀 5039

死鎖是如何產生的

本節介紹乙個和同步所相關的知識點死鎖。下面從3點來介紹死鎖。

第一點什麼是死鎖?第二點死鎖是如何產生的?第三點編寫乙個死鎖示例。

首先來看第一點,什麼是死鎖?死鎖是指兩個或兩個以上的執行緒,在執行過程中,由於競爭資源或者是由於彼此通訊而造成的一種阻塞現象,若無外力作用,他們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生的死鎖,這些永遠在互相等待的執行緒稱為死鎖執行緒。

簡而言之就是兩個或兩個以上的執行緒爭奪彼此的鎖造成阻塞,程式永遠處於阻塞狀態。

這就好比乙個女孩乙個男孩,女孩手上有男孩想要的魔方,男孩手上有女孩想要的棒棒糖,然後女孩說我想要棒棒糖,接著男孩說我想要魔方,於是女孩對男孩說,你把棒棒糖給我,我就給你魔方。這時男孩也對女孩說,你把魔方給我,我就給你棒棒糖,於是他們誰都不讓誰僵持住,這個過程就和死鎖很像。

下面我們把男孩女孩換成執行緒,看看執行緒a持有a鎖,想要b鎖,執行緒b持有b鎖下想要a鎖,

他們互不相讓,僵持住,形成了死鎖局面。

第一點介紹完了。我們再來看第二點,死鎖是如何產生的? 

死鎖的產生主要有4個條件,

第乙個條件是兩個或兩個以上的執行緒,

第二個條件是兩個或兩個以上的鎖。

第三個條件是兩個或兩個以上的執行緒持有不同所。

第四個條件是持有不同鎖的執行緒爭奪對方的鎖。

下面我們根據死鎖的產生條件,來編寫乙個死鎖事例,按照這4個條件一步一步編寫。

首先是第乙個條件,兩個或兩個以上的執行緒定義兩個類,

分別是locka和lockb然後繼承thread類,於是執行緒a和執行緒b兩個執行緒就準備好了。 

第乙個條件應滿足,再來看第二個條件,兩個或兩個以上的鎖。分別在locka和lockb兩個類裡面邊寫乙個靜態同步方法,printera和printb.於是同步鎖locka, lockb兩個鎖就準備好了。接著分別在兩個方法裡面輸出a和b這個輸出主要是用於觀察方法是否被正常呼叫。在輸出之前,我們使當前執行緒休眠一秒鐘,此步驟為的是讓執行緒不要太快執行完,待會還要在下面呼叫對方的方法去爭奪對方的鎖。

第二個條件以滿足,再來看看第三個條件,兩個或兩個以上的執行緒持有不同的鎖,很簡單,直接重寫run方法,然後在run方法裡面分別呼叫printa和printb即可。

於是執行緒a持有鎖就是locka.class,因為是靜態同步方法,所以鎖的型別就是自身類名點class,同樣的執行緒lockb就只有同步鎖lockb.class,

現在兩個執行緒已經持有了不同的數。第三個條件已滿足。

再來看看第四個條件,只有不同鎖的執行緒去爭奪對方的鎖,我們只需在printa a方法裡面去呼叫lockb .printb方法,在printab方法裡面去呼叫printa .printa方法即可,如此一來執行緒a就去爭奪lockb的鎖,執行緒b就去爭奪locka的鎖,最後1個條件也已經滿足了,現在4個條件全部滿足。 

下面來啟動這兩個執行緒,首先將執行緒建立出來,然後啟動他們。

接下來我們去看看執行結果。從執行結果來看,兩個執行緒分別在列印了a和b之後,進入相互爭奪鎖的過程,雙方僵持住形成了死鎖程式,想要停下來需手動關閉,也就是借助外力。

最後來總結一下本節的內容。本節演示了死鎖,死鎖的定義在這裡就不再贅述了。希望大家在以後使用同步的時候避免死鎖。

附錄:筆記完整文字:

本節介紹乙個和同步所相關的知識點死鎖。下面從3點來介紹死鎖。第一點什麼是死鎖?第二點死鎖是如何產生的?第三點編寫乙個死鎖示例。首先來看第一點,什麼是死鎖?死鎖是指兩個或兩個以上的執行緒,在執行過程中,由於競爭資源或者是由於彼此通訊而造成的一種阻塞現象,若無外力作用,他們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生的死鎖,這些永遠在互相等待的執行緒稱為死鎖縣城。簡而言之就是兩個或兩個以上的執行緒爭奪彼此的所造成阻塞,程式永遠處於阻塞狀態。 這就好比乙個女孩乙個男孩,女孩手上有男孩想要的魔方,男孩手上有女孩想要的棒棒糖,然後女孩說我想要棒棒糖,接著男孩說我想要魔方,於是女孩對男孩說,你把棒棒糖給我,我就給你魔方。這時男孩也對女孩說,你把魔方給我,我就給你棒棒糖,於是他們誰都不讓誰僵持住,這個過程就和死鎖很像。下面我們把男孩女孩換成執行緒,看看執行緒a持有a鎖,想要b鎖,執行緒b持有b鎖下壓a鎖,他們互不相讓,僵持住,形成了死鎖局面,第一點介紹完了。我們再來看第二點,死鎖是如何產生的? 死鎖的產生主要有4個條件,第乙個條件是兩個或兩個以上的執行緒,第二個條件是兩個或兩個以上的鎖。第三個條件是兩個或兩個以上的縣城持有不同所。第四個條件是只有不同鎖的執行緒爭奪對方的鎖。下面我們根據詞所的產生條件,來編寫乙個搜尋事例,按照這4個條件一步一步編寫。首先是第乙個條件,兩個或兩個以上的執行緒定義兩個類,分別是洛克a和look b然後繼承siri的勒,於是執行緒a和執行緒b兩個執行緒就準備好了。 第乙個條件應滿足,再來看第二個條件,兩個或兩個以上的鎖分別在outlook a和log b兩個類裡面邊寫乙個靜態同步方法,printer a和print的b於是同步鎖look a look,b兩個鎖就準備好了。接著分別在兩個方法裡面輸出a和b這個輸出主要是用於觀察方法是否被正常呼叫。在輸出之前,我們使當前執行緒休眠一秒鐘,此步驟為的是讓縣城不要太快執行完,待會還要在下面呼叫對方的方法去爭奪對方的手。第二個條件以滿足,再來看看第三個條件,兩個或兩個以上的執行緒持有不同勒索,很簡單,直接重寫run方法,然後在run方法裡面分別呼叫prune的a普潤的b即可。 於是執行緒a持有數就是錄a、點class,因為是靜態同步方法,所以所的型別就是自身類名點class,同樣的執行緒look ap就只有同步鎖log b點class,現在兩個縣城已經持有了不同的數。第三個條件已滿足。再來看看第四個條件,只有不同鎖的執行緒去爭奪對方的鎖,我們只需在point aa方法裡面去呼叫oc bea點point bea方法,在普潤的b方法裡面去呼叫洛克a點普潤的a方法即可,如此一來執行緒a就去爭奪look b的鎖,執行緒b就去爭奪洛克a的鎖,最後1個條件也已經滿足了,現在4個條件全部滿足。 下面來啟動這兩個執行緒,首先將執行緒建立出來,然後啟動他們。接下來我們去看看執行結果。從執行結果來看,兩個執行緒分別在列印了a和b之後,進入相互爭奪鎖的過程,雙方僵持住形成了死鎖程式,想要停下來需手動關閉,也就是借助外力。最後來總結一下本節的內容。本節演示了死鎖,死鎖的定義在這裡就不再贅述了。希望大家在以後使用同步的時候避免死鎖。

死鎖是如何產生的

死鎖產生的四個必要條件 何為必要條件?產生死鎖,必然四個條件成立 四個條件成立,不一定為死鎖 1 互斥 只有互斥才可以產生死鎖,兩個程序共同操作乙個資源,那麼,同一時間只能乙個程序來操作,那麼另乙個程序必須等待,此程序不釋放,另乙個永遠等待。產生死鎖 2 不可以強佔 兩個程序,乙個程序占有某乙個資源...

常見的死鎖是如何產生的,如何避免

什麼場景下回發生00060死鎖問題 一般情況下,資料庫自身發生死鎖的情況很少,一般情況都是因為應用本身呼叫問題導致的00060異常。比如說有兩個會話sid,分別為 138 和136,這兩個會話都要對 6677 和 7788 兩個人加工資,但是執行的順序不一樣,操作分別是 會話session號 ses...

什麼是死鎖?怎樣避免死鎖的產生?

死鎖是指兩個或兩個以上的程序在執行過程中,因爭奪資源或不正確的程序間推進順序,而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去,此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。雖然程序在執行過程中,可能發生死鎖,但死鎖的發生也必須具備一定的條件,死鎖的發生...