Java产生死锁的一个简单例子
JAVA 一个 简单 例子 产生 死锁
2023-09-14 09:07:33 时间
本文转载自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{ @Override public void run(){ try{ System.out.println("Lock1 running"); while(true){ synchronized(DeadLock.obj1){ System.out.println("Lock1 lock obj1"); Thread.sleep(3000);//获取obj1后先等一会儿,让Lock2有足够的时间锁住obj2 synchronized(DeadLock.obj2){ System.out.println("Lock1 lock obj2"); } } } }catch(Exception e){ e.printStackTrace(); } } } class Lock2 implements Runnable{ @Override public 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{ @Override public 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{ @Override public 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可以不断地循环获取并释放它们,这时没有死锁
相关文章
- 从一个OutOfMemoryError 学会了分析Java内存泄漏问题
- Java实现 LeetCode 738 单调递增的数字(暴力)
- Java实现 LeetCode 655 输出二叉树(DFS+二分)
- Java实现 LeetCode 572 另一个树的子树(遍历树)
- Java实现 LeetCode 503 下一个更大元素 II
- Java实现 神犇的悲惨一生
- Java实现 LeetCode 34 在排序数组中查找元素的第一个和最后一个位置
- Java实现 蓝桥杯 算法训练 1的个数
- java实现第六届蓝桥杯立方尾不变
- Java实现第九届蓝桥杯缩位求和
- 编写高质量代码:改善Java程序的151个建议 --[117~128]
- Java签名算法之HMAC-SHA1
- 安卓逆向7,frida小练习,hook java 层密码校验函数,绕过密码验证,进入下一个界面
- ABAP模拟Java Spring依赖注入(Dependency injection)的一个尝试
- 一个基于Java实现的Github issue图片自动下载工具
- Java反射机制在UI自动化测试中的一个应用
- Atitit.excel导出 功能解决方案 php java C#.net版总集合.doc
- 华为OD机试 - 开放日活动、取出尽量少的球(Java & JS & Python)
- 常见Java面试题 BIO、NIO、AIO 有什么区别?
- Java //SR2.37 假设在程序中已经创建了一个Scanner类的对象myScanner和一个整型变量value,请编写程序提示用户输入他们的年龄,并将输入值存放到value变量中。
- Java //EX2.16 设page是Graphics类的一个对象,编写一条语句画一个高70宽35的矩形,并且左上角的坐标为(10,15)
- Java //PP2.8 编写一个应用程序,以小时、分、秒读取时间长度,然后全部换算成秒并打印输出结果(例如,1小时28分42秒等于5322秒)
- 【Java 并发编程实战】使用 AQS 实现一个简单的互斥锁
- 如何使用IDEA创建一个简单的java工程?
- 【Java并发编程实战】—–“J.U.C”:ReentrantLock之二lock方法分析
- Java如何打印异常的堆栈?
- JAVA中有一个特殊的类: Object。它是JAVA体系中所有类的父类(直接父类或者间接父类)。
- 应用于Java中的一个开源的表达式语言(Expression Language)
- 简单说明什么是递归?什么情况会使用?并使用java实现一个简单的递归程序。
- Swing 是一个为Java设计的GUI工具包
- Java能够编译通过,但是显示“找不到或无法加载主类”
- Java基础_异常处理