本文转载自https://www.cnblogs.com/mudao/p/5867107.html

感谢作者

对我很有帮助

思路是创建两个字符串a和b,再创建两个线程A和B,让每个线程都用synchronized锁住字符串(A先锁a,再去锁b;B先锁b,再锁a),如果A锁住a,B锁住b,A就没办法锁住b,B也没办法锁住a,这时就陷入了死锁。直接贴代码:

public class DeadLock {public static String obj1 = "obj1";public static String obj2 = "obj2";public static void main(String[] args){Thread a = new Thread(new Lock1());Thread b = new Thread(new Lock2());a.start();b.start();}
}
class Lock1 implements Runnable{@Overridepublic void run(){try{System.out.println("Lock1 running");while(true){synchronized(DeadLock.obj1){System.out.println("Lock1 lock obj1");Thread.sleep(3000);//获取obj1后先等一会儿,让Lock2有足够的时间锁住obj2synchronized(DeadLock.obj2){System.out.println("Lock1 lock obj2");}}}}catch(Exception e){e.printStackTrace();}}
}
class Lock2 implements Runnable{@Overridepublic void run(){try{System.out.println("Lock2 running");while(true){synchronized(DeadLock.obj2){System.out.println("Lock2 lock obj2");Thread.sleep(3000);synchronized(DeadLock.obj1){System.out.println("Lock2 lock obj1");}}}}catch(Exception e){e.printStackTrace();}}
}

运行的结果如图所示:

可以看到,Lock1获取obj1,Lock2获取obj2,但是它们都没有办法再获取另外一个obj,因为它们都在等待对方先释放锁,这时就是死锁。

如果我们只运行Lock1呢?修改一下main函数,把线程b注释掉。

public class DeadLock {public static String obj1 = "obj1";public static String obj2 = "obj2";public static void main(String[] args){Thread a = new Thread(new Lock1());//Thread b = new Thread(new Lock2());a.start();//b.start();}
}
class Lock1 implements Runnable{@Overridepublic void run(){try{System.out.println("Lock1 running");while(true){synchronized(DeadLock.obj1){System.out.println("Lock1 lock obj1");Thread.sleep(3000);synchronized(DeadLock.obj2){System.out.println("Lock1 lock obj2");}}}}catch(Exception e){e.printStackTrace();}}
}
class Lock2 implements Runnable{@Overridepublic void run(){try{System.out.println("Lock2 running");while(true){synchronized(DeadLock.obj2){System.out.println("Lock2 lock obj2");Thread.sleep(3000);synchronized(DeadLock.obj1){System.out.println("Lock2 lock obj1");}}}}catch(Exception e){e.printStackTrace();}}
}

运行结果为:

由于没有其它线程和Lock1争夺obj1和obj2,Lock1可以不断地循环获取并释放它们,这时没有死锁

转载于:https://www.cnblogs.com/baxianhua/p/9408459.html

Java产生死锁的一个简单例子相关推荐

  1. 一个简单例子:贫血模型or领域模型

    转:一个简单例子:贫血模型or领域模型 贫血模型 我们首先用贫血模型来实现.所谓贫血模型就是模型对象之间存在完整的关联(可能存在多余的关联),但是对象除了get和set方外外几乎就没有其它的方法,整个 ...

  2. Java遗传算法(GA)简单例子

    文章目录 前言 一.解决的函数 二.遗传和变异算子 1.交叉 2.变异 源代码 前言 Java遗传算法(GA)简单例子 采用的是实数编码 一.解决的函数 f(x) = x1²+x2²+x3² //计算 ...

  3. SAP MM采购定价过程的一个简单例子

    SAP MM采购定价过程的一个简单例子 本文以一个简单的例子阐述了SAP MM模块中采购定价的基本原理.本例中,假定采购订单里输入的是含税采购价,然后系统自动计算出物料最终的采购价格(含税价-税额=采 ...

  4. java播放声音类和一个简单示例

    java播放声音类和一个简单示例 播放声音的类 复制代码 代码如下:  import java.io.File; import java.io.IOException; import javax.so ...

  5. KaTex的一个简单例子

    在网页中可以用KaTex显示数学公式,KaTex官网是https://katex.org 以下是KaTex的一个简单例子: 下载https://github.com/KaTeX/KaTeX/archi ...

  6. 单纯形法之人工变量法求解步骤:一个简单例子

    文章目录 人工变量法 1. 大M法 1.1. 题目 1.2. 转化为标准型 1.3. 添加人工变量 2. 两阶段法 2.1. 步骤 2.2. 题目 2.2.1. 转化为标准型 2.2.2. 添加人工变 ...

  7. JAVA毕业设计vue开发一个简单音乐播放器计算机源码+lw文档+系统+调试部署+数据库

    JAVA毕业设计vue开发一个简单音乐播放器计算机源码+lw文档+系统+调试部署+数据库 JAVA毕业设计vue开发一个简单音乐播放器计算机源码+lw文档+系统+调试部署+数据库 本源码技术栈: 项目 ...

  8. 初次使用CTex时的一个简单例子

    初次使用CTex时的一个简单例子 1.初次使用Ctex时的例子 第一次使用 LATEX,在WinEdt编辑以下代码,然后使用PDFLaTeX生成PDF文档. \documentclass{articl ...

  9. 协方差检验用在什么地方_通过一个简单例子,通俗讲下协方差分析

    内容来自:"小白学统计"微信公众号,感谢作者授权. 临床中经常碰到这种设计:研究对象分为两组,接受不同治疗(如治疗组和安慰组),每组分别在治疗前和治疗后测量观察指标(如血压值).目 ...

最新文章

  1. FF小股东美国起诉恒大 要求收回中国公司控制权
  2. 基于实体模型开发主题管理简析
  3. 关于tomcat无法启动问题详解
  4. python与excel结合-Python和Excel终于可以
  5. 解决bug_赛博朋克2077BUG卡关怎么办?卡关BUG解决办法
  6. linux man手册_读书笔记:Linux命令行与shell脚本编程大全 第一章~第五章
  7. Dynamics CRM - 如何修复 Access Is Denied,ObjectTypeCode: 2500 的错误
  8. 什么是字节码,采用字节码的好处是什么
  9. tomcat启动后命令行日志中文乱码
  10. linux进程监控自动重启,Linux监控进程,进程关闭自动重启方案
  11. 一场由SameSite字段引发的前端悲剧
  12. 【Grub Grub2】万能优盘启动盘 (WinPE、LinuxPE)-- 方法1 U盘三分区法(不推荐,供参考)
  13. matplotlib堆积图
  14. IPS(入侵防御系统)技术
  15. win10/win11无损扩大C盘空间,跨盘合并C、E盘
  16. 夜深人静刷力扣(2)
  17. 写给冬天里开放的那些花儿
  18. LeetCode_初级算法_数组
  19. 洛谷 P3620 - P3621 数据备份、风铃、动物园(APIO 2007)
  20. Android开发:手机震动工具类

热门文章

  1. 【leetcode】Permutations
  2. SQLServer 批量插入数据的两种方法
  3. 使用VisualStudio开发php的图文设置方法
  4. 浅谈C#中的枚举 【转自http://www.cnblogs.com/liyingyi/archive/2005/12/28/306772.html】
  5. 虚幻UE4的后处理特效介绍 http://www.52vr.com/thread-31215-1-1.html
  6. TCP与UDP传输协议
  7. opencv stereo match sample
  8. 对象序列化Java中的序列化
  9. flex textInput 限制输入
  10. 一位Erlang程序员的自白