什么是死锁?
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。
产生死锁的四个必要条件:
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
Demo
1 public class DeadLockDemo implements Runnable{ 2 //控制锁定的对象 3 public int 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启动
所以他们互相等待,成了死锁
时间: 2024-10-01 06:10:24