死锁的简单示例

时间:2021-12-11 16:35:11

什么是死锁?

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。

产生死锁的四个必要条件:

(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启动
所以他们互相等待,成了死锁