死锁的简单示例

什么是死锁?

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

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

(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

死锁的简单示例的相关文章

AMQP消息队列之RabbitMQ简单示例

前面一篇文章讲了如何快速搭建一个ActiveMQ的示例程序,ActiveMQ是JMS的实现,那这篇文章就再看下另外一种消息队列AMQP的代表实现RabbitMQ的简单示例吧.在具体讲解之前,先通过一个图来概览下: 1.添加Maven依赖 <!-- rabbitmq begin --> <dependency> <groupId>org.springframework.amqp</groupId> <artifactId>spring-rabbit

HMM的维特比算法简单示例

今天读了一位大牛的关于HMM的技术博客,读完之后,写了一个关于维特比算法的简单示例,用scala和java语言混合编写的.现在上传之. package com.txq.hmm import java.utilimport scala.collection._ /** * HMM维特比算法,根据显示状态链条估计隐式链条 * @param states 隐式states * @param observations 显式states * @param start_probability 初始概率向量

spring-servlet.xml简单示例

spring-servlet.xml简单示例 某个项目中的spring-servlet.xml 记下来以后研究用 1 <!-- springMVC简单配置 --> 2 <?xml version="1.0" encoding="UTF-8"?> 3 <beans xmlns="http://www.springframework.org/schema/beans" 4 xmlns:xsi="http://w

关于Ajax实现的简单示例

一.代码示例 关于Ajax的基本概念(包括XMLHttpRequest对象及其相关方法属性)移步这里(w3school中文版)学习了解. <!doctype html> <html lang = "en"> <head> <meta charset = "utf-8"> <title>使用Ajax异步加载数据</title> <script type = "text/javasc

【转】bind简单示例

bind简单示例代码 namespace { class placeholder_ {}; placeholder_ __1; } template <typename R, typename T, typename Arg> class simple_bind_t { private: typedef R (T::*F)(Arg); F f_; T* t_; Arg& a_; public: simple_bind_t(F f, T* t, Arg &a) : f_(f),

SQL左连接、右连接和内连接的简单示例

left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录: right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录: inner join(等值连接) 只返回两个表中联结字段相等的行:举例如下: -------------------------------------------- 表A记录如下: aID aNum 1 a20050111 2 a20050112 3 a20050113 4 a20050114 5 a20050115 表B记录

Backbone简单示例

要的资源: <script type="text/javascript" src="../dep/underscore-1.6.0.min.js"></script> <script type="text/javascript" src="../dep/jquery-1.11.1.min.js"></script> <script type="text/javas

动态网站开发技术学习2:VS 2010制作作第一个简单示例网站

制作一个简单示例网站的步骤: 一,启动VS 2010开发环境,选择菜单中的"文件",选择其中的"新建",再选择"网站",会弹出"新建网站"对话框. 二,在"新建网站"的对话框,在"已安装模板"中选择Visual C#,右侧的选择"ASP.NET网站"选项,单击"新建网 站"中的"文件系统",下拉菜单中有"文件系统&qu

简单示例

下面是一个简单示例,当阀切换至自动模式时,会自动向储罐中补水,到达设定值后自动关闭.当储罐中水位到达设定值后水泵自动开启,水位低时联锁关闭. 上图分别显示了阀门和水泵操作面板 上图显示了水泵的联锁信息 上图是参数设置 上图显示了水位曲线