死鎖的簡單示例
阿新 • • 發佈:2017-06-12
clas rgs system stack 更改 示例 鎖定 相等 mage
什麽是死鎖?
死鎖是指兩個或兩個以上的進程在執行過程中,由於競爭資源或者由於彼此通信而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。
產生死鎖的四個必要條件:
(1) 互斥條件:一個資源每次只能被一個進程使用。
(2) 請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。
(3) 不剝奪條件:進程已獲得的資源,在末使用完之前,不能強行剝奪。
(4) 循環等待條件:若幹進程之間形成一種頭尾相接的循環等待資源關系。
Demo
1 public class DeadLockDemo implements Runnable{ 2 //控制鎖定的對象 3 publicint flag = 1; 4 //線程名字,用以區分 5 public String name = ""; 6 //創建對象用以鎖定 7 static Object o1 = new Object(); 8 static Object o2 = new Object(); 9 10 @Override 11 public void run() { 12 System.out.println(name+"的flag=" + flag); 13 if (flag == 1) { 14 //鎖定o1 15 synchronized (o1) { 16 try { 17 //延時一會 18 Thread.sleep(500); 19 } catch (Exception e) { 20 e.printStackTrace(); 21 } 22 //此時o2被鎖定,所以在等待 23 synchronized(o2) { 24 System.out.println("結束鎖定O2(永遠不會出現這句話。。)"); 25 } 26 } 27 } 28 if (flag == 0) { 29 //鎖定o2 30 synchronized (o2) { 31 try { 32 //延時一會 33 Thread.sleep(500); 34 } catch (Exception e) { 35 e.printStackTrace(); 36 } 37 //此時o1被鎖定,所以在等待 38 synchronized (o1) { 39 System.out.println("結束鎖定O1(永遠不會出現這句話。。)"); 40 } 41 } 42 } 43 } 44 public static void main(String[] args) { 45 DeadLockDemo td1 = new DeadLockDemo(); 46 DeadLockDemo td2 = new DeadLockDemo(); 47 //設置參數 48 td1.flag = 1; 49 td1.name="線程1"; 50 td2.flag = 0; 51 td2.name="線程2"; 52 53 //啟動線程,更改順序得到的結果基本相似 54 new Thread(td2).start(); 55 new Thread(td2).start(); 56 } 57 }
輸出結果:
圖一
圖二
圖1和圖2其實都能出現,根據你線程放的順序,前面的先輸出的概率大點。
td1啟動後鎖定了o1,睡了後等待o2啟動
td2啟動後鎖定了o2,睡了後等待o1啟動
所以他們互相等待,成了死鎖
死鎖的簡單示例