使用java執行緒模擬死鎖

2021-07-24 17:29:21 字數 1344 閱讀 5110

原文

當兩個或多個執行緒之間同時等待對方釋放資源的時候就會形成執行緒之間的死鎖

當兩個執行緒被阻塞,每個執行緒在等待另乙個執行緒時就發生死鎖

當多個執行緒等待乙個物件鎖時,沒有獲取到鎖的執行緒將發生阻塞。

執行緒的阻塞:

1. sleep() 方法:sleep()允許指定以毫秒為單位的一段時間作為引數,它使得執行緒在指定的時間內進入阻塞狀態,不能得到cpu時間,指定的時間一過,執行緒重新進入可執行狀態。執行緒不會釋放它的「鎖標誌」.

2. suspend() 和 resume()方法:兩個方法配套使用,suspend()使得執行緒進入阻塞狀態,並且不會自動恢復,必須其對應的resume()被呼叫,才能使得執行緒重新進入可執行狀態。典型地,suspend() 和 resume()被用在等待另乙個執行緒產生的結果的情形:測試發現結果還沒有產生後,讓執行緒阻塞,另乙個執行緒產生了結果後,呼叫 resume()使其恢復。

3. yield() 方法:yield() 使得執行緒放棄當前分得的 cpu時間,但是不使執行緒阻塞,即執行緒仍處於可執行狀態,隨時可能再次分得 cpu 時間。呼叫 yield()的效果等價於排程程式認為該執行緒已執行了足夠的時間從而轉到另乙個執行緒。

4. wait() 和 notify() 方法:兩個方法配套使用,wait()使得執行緒進入阻塞狀態,它有兩種形式,一種允許指定以毫秒為單位的一段時間作為引數,另一種沒有引數,並且該物件上的鎖被釋放.前者當對應的notify() 被呼叫或者超出指定時間時執行緒重新進入可執行狀態,後者則必須對應的 notify() 被呼叫

public class deadlock  

} class runner implements runnable  

public void run()  catch (interruptedexception e)  

// 鎖定資源2 

synchronized (o2)  

} } 

}  sleep:它使得執行緒在指定的時間內進入阻塞狀態,不能得到cpu 

時間,把執行機會給其他執行緒,但是監控狀態依然保持,不會 釋放物件鎖的.

一般造成死鎖必須同時滿足如下4個條件:

互斥條件

執行緒使用的資源必須至少有乙個是不能共享的。

請求與保持條件

至少有乙個執行緒必須持有乙個資源並且正在等待獲取乙個當前被其他執行緒持有的資源。

非剝奪條件

分配的資源不能從相應的執行緒中被強制剝奪。

迴圈等待條件

第乙個執行緒等待其他執行緒,後者又在等待第乙個執行緒。

因為要發生死鎖,這4個條件必須同時滿足,所以要防止死鎖的話,只需要破壞其中乙個條件即

C 模擬死鎖問題

模擬學生作筆記,假設乙個學生只有同時擁有筆記本和筆才能學習,這裡模擬2個學生,但只有1個筆記本和乙隻筆 如果想進行學習,需同時獲得筆記本和筆,當a同學獲得筆記本時,b也已獲得筆,此時,a試圖獲得b的筆,而b試圖獲得a的筆記本,此時便發生死鎖 using system using system.col...

乙個模擬死鎖的多執行緒

package org.kevinlifeng public class testdeadlock implements runnable catch interruptedexception e t1嘗試鎖o2 可o2 已經被t2 給鎖住了還沒釋放,一直等待 synchronized o2 到了這...

java執行緒死鎖模擬

1,關於死鎖的理解 死鎖,我們可以簡單的理解為是兩個執行緒同時使用同一資源,兩個執行緒又得不到相應的資源而造成永無相互等待的情況。2,模擬死鎖 背景介紹 我們建立乙個朋友類,當朋友向我們鞠躬的時候,我們也要向朋友鞠躬,這樣才算乙個完整的動作。當兩人 同時鞠躬的時候,都在等待對方鞠躬。這時就造成了死鎖...