什么情况下会发生死锁
死锁发生的条件
- 互斥条件:就是一个资源只能有一个进程占有,不可以被两个或者多个进程占有
- 不可抢占条件:进程已经获得的资源在未使用完之前,不可以被抢占,只能在使用完之后自己释放
- 占有申请条件:进程自己已经至少保持一个资源,又请求其他资源,但是这个资源被其他进程占有,而且又不释放自己已经占有的资源
- 循环等待条件:发生死锁时,必定会形成一个进程——资源的环路。进程集合{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 }
最后两个线程都等着对方的资源,都进入等待状态,最后不会有线程执行,就进入了死锁状态