四種情況
1、交叉鎖導(dǎo)致程序死鎖:比如線程A持有R1的鎖等待R2的鎖,線程B持有R2的鎖等待R1的鎖
2、內(nèi)存不足:比如兩個(gè)線程T1和T2,T1已獲取10MB內(nèi)存,T2獲取了15MB內(nèi)存,T1和T2都需要獲取30MB內(nèi)存才能工作,但是剩余可用的內(nèi)存為10MB,這樣兩個(gè)線程都在等待彼此釋放內(nèi)存資源
3、一問一答式的數(shù)據(jù)交換:服務(wù)器開啟某個(gè)端口,等待客戶端訪問,客戶端發(fā)送請(qǐng)求后,服務(wù)器因某些原因錯(cuò)過了客戶端請(qǐng)求,導(dǎo)致客戶端等待服務(wù)器回應(yīng),而服務(wù)器等待客戶端發(fā)送請(qǐng)求
4、死循環(huán)引起的死鎖:比較常見,使用jstack等工具看不到死鎖,但是程序不工作,CPU占有率高,這種死鎖也叫系統(tǒng)假死,難以排查和重現(xiàn)
實(shí)例
public class Main {
private final Object MUTEX_READ = new Object();
private final Object MUTEX_WRITE = new Object();
public void read(){
synchronized (MUTEX_READ){
synchronized (MUTEX_WRITE){
}
}
}
public void write(){
synchronized (MUTEX_WRITE){
synchronized (MUTEX_READ){
}
}
}
public static void main(String[] args) throws InterruptedException {
Main m = new Main();
new Thread(()->{
while (true){
m.read();
}
}).start();
new Thread(()->{
while (true){
m.write();
}
}).start();
}
}
以上就是java引發(fā)死鎖的四種情況,希望對(duì)大家有所幫助。更多關(guān)于“java培訓(xùn)”的問題,歡迎咨詢千鋒教育在線名師。千鋒教育多年辦學(xué),課程大綱緊跟企業(yè)需求,更科學(xué)更嚴(yán)謹(jǐn),每年培養(yǎng)泛IT人才近2萬人。不論你是零基礎(chǔ)還是想提升,都可以找到適合的班型,千鋒教育隨時(shí)歡迎你來試聽。