多執行緒之死鎖

2021-08-01 08:56:10 字數 979 閱讀 7091

1:死鎖發生的場景

有時候兩個或者多個執行緒需要訪問同乙份資源,這裡就涉及到執行緒同步的問題:

//thread1:

synchronized(object1)

}

//thread2

synchronized(object2)

}

看看上面的例子,兩個執行緒各自都有想要訪問對方的想法,可是雙方都不願意放手,就像a拿到了開1門的鑰匙,開開門以後他給關了,又想進2門,但是沒有鑰匙啊,b呢,b拿到了2門的鑰匙進門以後他也把門給關了,然後他又想進1門,也沒有鑰匙,兩個人你看看我,我看看你,不願意妥協,就造成了死鎖,哈哈
2:死鎖發生的四個必要條件
(1)互斥條件:乙個資源每次只能被乙個程序使用。(如上例子中的1門被a獨自占有,2門被b獨自占有)
(2)請求與保持條件:乙個程序因請求資源而阻塞時,對已經獲得的資源保持不放。(例如a進了1門就是不把鑰匙交出來)
(3)不剝奪條件:程序已經獲得的資源,在沒有使用之前,不能強行剝奪。(例如上例子中的a有了一門的鑰匙不能強行把他的鑰匙給搶走)
(4)迴圈等待條件,若干程序之間形成一種頭尾相連的迴圈等待資源關係(例如上例子中的a等待b執行完,b等待a執行網)
3:解決方案:資源排序技術
該技術是給每乙個需要鎖的物件指定乙個順序,確保每乙個執行緒都按這個順序來獲取鎖,例如在上例子中,設對1門和2門的順序進行排序,採用資源排序技術,b只有拿到1門上的鎖才能開啟2門注意這個時候b不再擁有2門的鑰匙,一旦a拿到了1門的鑰匙,那麼b就必須等待a把他的任務給完成了,然後把鑰匙交出來給b去完成任務者其實跟現實中上衛生間差不多,文明禮讓才會井然有序哈哈

多執行緒之死鎖

死鎖。同步中巢狀同步。你有一根筷子,我有一根筷子,我要吃飯,你不給我,我不給你,誰都吃不著飯,死鎖發生,但是死鎖不一會發生,也會存在和諧的狀態,就是你把筷子給我,我吃一口,我再把筷子給你,你再吃一口 class ticket implements runnable else while true s...

java多執行緒之 死鎖

當兩個或多個執行緒競爭試圖獲取對方持有的同步鎖時,它們都會處於阻塞狀態,除非某個執行緒主動釋放自己所持有的同步鎖,這時,死鎖就出現了。用下面這張圖很好理解 如圖,執行緒thread1和thread2都有兩個同步方法operation1 operation2 operation1 中會呼叫operat...

多執行緒之死鎖例子

例 小明和大大 吃水果 乙個人同時有水果刀和水果 才能吃水果 如果小明拿到水果,而同時大大也拿到水果,則兩個執行緒一直互相等待,造成死鎖 兩個執行緒,小明和大大同時執行 package demo4 public class dielock extends thread else catch exce...