死锁的简单示例

Posted Mrlw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了死锁的简单示例相关的知识,希望对你有一定的参考价值。

什么是死锁?

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

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

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

 

以上是关于死锁的简单示例的主要内容,如果未能解决你的问题,请参考以下文章

Java并发编程 - 一个简单的死锁示例和死锁的检查

死锁的简单示例

处理屏幕旋转上的片段重复(带有示例代码)

为啥这段代码会泄露? (简单的代码片段)

JavaSE8基础 死锁之同步嵌套 简单示例

在android中使用带有片段的roboguice的任何简单示例?