執行緒死鎖是指兩個或兩個以上的執行緒互相持有對方所需要的資源,由於synchronized的特性,乙個執行緒持有乙個資源,或者說獲得乙個鎖,在該執行緒釋放這個鎖之前,其它執行緒是獲取不到這個鎖的,而且會一直死等下去,因此這便造成了死鎖。
互斥條件:乙個資源,或者說乙個鎖只能被乙個執行緒所占用,當乙個執行緒首先獲取到這個鎖之後,在該執行緒釋放這個鎖之前,其它執行緒均是無法獲取到這個鎖的。
占有且等待:乙個執行緒已經獲取到乙個鎖,再獲取另乙個鎖的過程中,即使獲取不到也不會釋放已經獲得的鎖。
不可剝奪條件:任何乙個執行緒都無法強制獲取別的執行緒已經占有的鎖。
迴圈等待條件:執行緒a拿著執行緒b的鎖,執行緒b拿著執行緒a的鎖。
死鎖演示
package com.github.excellent01;
/** * @auther plg
* @date 2019/5/18 12:12
*/public
class
deadlock}}
public
void
method2()
throws interruptedexception }}
public
static
void
main
(string[
] args)
catch
(interruptedexception e)})
.start()
;new
thread((
)->
catch
(interruptedexception e)})
.start();}}
執行結果:
這樣便造成了死鎖,thread1拿著lock1,想要lock2,thread2拿著lock2,想要lock1.
加鎖順序:執行緒按照相同的順序加鎖。
加鎖時限,執行緒獲取鎖的過程中限制一定的時間,如果給定時間內獲取不到,就算了,別勉強自己。這需要用到lock的一些api。
在發生死鎖之後,程式就卡住了沒有任何反應,但程式仍在執行,因此需要借助一些。
首先使用 jps -l 顯示正在執行的虛擬機器程序,並顯示虛擬機器執行主類(main函式所在
的類)名稱以及這些程序的本地虛擬機器唯一id。
使用 jstack + id 進行跟蹤排查
死鎖的原因,具體哪個執行緒,具體的行號都說明的很清楚。
執行緒中的死鎖DeadLock
死鎖 死鎖是指在一組程序中的各個程序均占有不會釋放的資源,但因互相申請被其他程序所站用不會釋放的資源而處於的一種永久等待狀態。簡言之為多個程序互相佔著對方需要的資源,不肯釋放,形成僵持。產生死鎖的四個必要條件 1 互斥條件 乙個資源每次只能被乙個程序使用。2 請求與保持條件 乙個程序因請求資源而阻塞...
關於java的死鎖DeadLock
看scjp考題的時候,關於一道多執行緒題目,總是不能把它推成死鎖,鬱悶之下,一看答案,原來真的不是死鎖,可是為什麼我老是想要把它推成死鎖呢?很明顯,是沒有學到家。所以,翻箱倒櫃查完資料之後,寫出乙個死鎖demo,來確定自己確實知道了什麼是死鎖。public class deadlockdemo ca...
JAVA 什麼是死鎖 deadlock ?
死鎖 是指兩個或兩個以上的程序在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去 1 因為系統資源不足。2 程序執行推進順序不合適。3 資源分配不當等。如果系統資源充足,程序的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則 就會因爭奪有限的資源而陷入死鎖。其...