死鎖是指在一組程序中的各個程序均占有不會釋放的資源,但因互相申請被其他程序所站用不會釋放的資源而處於的一種永久等待狀態。
一.
死鎖產生的原因:
(1)因為系統資源不足,不能滿足程序的資源請求,會導致多個執行緒之間同時爭奪乙個資源。
(2)程序執行的順序不合適。
(3)資源分配不得當,有的程序分配的資源太少,會因為爭奪資源而陷入死鎖。
二.
死鎖產生的場景:
(1)多個執行緒:他們因為彼此申請對方的資源而導致的死鎖。例如:a執行緒申請b執行緒的鎖,因為鎖被占用而會將a執行緒掛起而等待b執行緒釋放鎖,同時b執行緒申請a執行緒的鎖,同樣因為a的鎖被占用,而導致b執行緒被掛起,當a,b執行緒都被掛起時因為沒有機會釋放鎖,從而進入死鎖。
(2)單個執行緒:此執行緒有自己的鎖,但是還要申請新的鎖,在申請新鎖的時候,因為鎖被占用,所以會被掛起等待,但是鎖是被自己占用的,而自己又被掛起,因為沒有機會釋放鎖,從而會進入死鎖狀態。
三.
死鎖產生的條件:
(1)互斥:乙個資源一次只能被乙個程序使用,當該程序使用此資源的時候,其它程序就不能使用此資源,具有獨占性。
(2)請求與保持:乙個程序要請求新的資源,但同時對已獲得的該資源的程序不釋放此資源,則要等待其它程序釋放資源。
(3)迴圈等待:若干個程序都要申請資源,但是對已獲得資源的程序不釋放此資源,則若干程序陷入迴圈等待,等待獲得資源的程序釋放此資源。
(4)不剝奪:對於程序已獲得的資源,在未使用完之前,不能被強行剝奪。
四.
如何避免死鎖?
首先應該根據產生死鎖的原因來避免死鎖。(比如申請足夠的資源,以及程序的執行順序應該合理,高效,程序間資源的分配應該得當)。
接下來根據死鎖產生的條件分析:對於在請求新的資源前,應該將自己的鎖釋放掉,再申請新的鎖,對於不剝奪要適情況而定,如果別人鎖的優先順序比自己鎖的優先順序高,則可以搶過來。
簡單的死鎖
package test1 乙個簡單的死鎖類 author istar 當類的物件flag 1時 t1 先鎖定o1,睡眠500毫秒,然後鎖定o2 而t1在睡眠的時候另乙個flag 0的物件 t2 執行緒啟動,先鎖定o2,睡眠500毫秒,等待t1釋放o1 t1睡眠結束後需要鎖定o2才能繼續執行,而此時...
死鎖 簡單了解
1 什麼是死鎖 1.1 死鎖定義 死鎖是指兩個或兩個以上的執行緒在執行過程中,由於競爭資源或者由於彼此通訊而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。1.2 死鎖產生條件 1 互斥條件 某個資源某一時刻只能...
Java 死鎖的簡單例項
雖然網上有各種關於死鎖的說法,但是卻沒有乙個實際的案例來闡述這個死鎖到底是什麼樣的 那麼這裡有乙個簡單的死鎖例項 執行緒t1需要先使用掃瞄器掃瞄檔案 再使用印表機列印檔案,之後工作完畢 執行緒t2需要先使用印表機列印檔案 再使用掃瞄器掃瞄檔案,之後工作完畢 如果是正常的工作秩序,那應該是t1先擁有掃...