死鎖發生的條件
- 互斥條件:就是一個資源只能有一個進程占有,不可以被兩個或者多個進程占有
- 不可搶占條件:進程已經獲得的資源在未使用完之前,不可以被搶占,只能在使用完之后自己釋放
- 占有申請條件:進程自己已經至少保持一個資源,又請求其他資源,但是這個資源被其他進程占有,而且又不釋放自己已經占有的資源
- 循環等待條件:發生死鎖時,必定會形成一個進程——資源的環路。進程集合{p1,p2,p3}中,p1請求p2占有的資源,p2請求p3占有的資源,p3請求p1占有的資源
看到一個例子感覺很好:http://blog.csdn.net/qq_35064774/article/details/51793656
1 package com.qf.test; 2 public class TestThread { 3 public static void main(String[] args) { 4 // test dead lock 5 Thread t9 = new Thread( 6 new DeadLock(true)); 7 Thread t10 = new Thread( 8 new DeadLock(false)); 9 t9.start(); 10 t10.start(); 11 } 12 } 13 14 class DeadLock implements Runnable{ 15 16 boolean lockFormer; 17 static Object o1 = new Object(); 18 static Object o2 = new Object(); 19 DeadLock(boolean lockFormer){ 20 this.lockFormer = lockFormer; 21 } 22 23 @Override 24 public void run() { 25 if(this.lockFormer){ 26 synchronized (o1) { 27 try { 28 Thread.sleep(500); 29 } catch (InterruptedException e) { 30 e.printStackTrace(); 31 } 32 synchronized (o2) { 33 System.out.println("1ok"); 34 } 35 } 36 }else{ 37 synchronized (o2) { 38 try { 39 Thread.sleep(500); 40 } catch (InterruptedException e) { 41 e.printStackTrace(); 42 } 43 synchronized (o1) { 44 System.out.println("1ok"); 45 } 46 } 47 } 48 49 } 50 }
最后兩個線程都等着對方的資源,都進入等待狀態,最后不會有線程執行,就進入了死鎖狀態