前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java中死锁的概念是什么给个例子

java中死锁的概念是什么给个例子

作者头像
马克java社区
修改2021-04-26 14:38:45
3460
修改2021-04-26 14:38:45
举报
文章被收录于专栏:java大数据java大数据

10.死锁

当两个线程循环依赖于一对同步对象(monitor)时将发生死锁。例如:

一个线程进入对象ObjA上的监视器,而另一个线程进入对象ObjB上的监视器。如果ObjA中的线程试图调用ObjB上的任何 synchronized 方法,同时,反向的情况也发生,就将发生死锁。

死锁很少发生,但一旦发生就很难调试。

在以下例子中:a正在等待b释放,b也正在等待a释放,a怎么才能释放锁呢?只有a往前移动一个语句,执行完disp,a就能自动释放锁,但执行disp需要b释放锁,所以因为执行不了disp,所以a不能释放锁。b也一样,所以大家就在这互相等,从而发生了死锁。

对 于下面的例子1.start()作为一个线程,获得d1的锁。为什么?因为synchronized public void run().所以run()的synchronized不能去掉。d2.start()作为一个线程获得d2的锁。没有问题,所以打印出来两个“in ru”。然后,在d1's run()的 d.disp()使得d1试图从d2获得一个锁,因为在这一刻,d.disp()意味着d1.d.disp()= d2.disp(),意味着d1试图得到一个锁从d2,反之亦然。

如果任何synchronized 删除,不会发生死锁,但安全性降低。

例1.10.1

class DeadLockExam extends Thread {

DeadLockExam d;

synchronized void disp() {

System.out.println("in di");

}

synchronized public void run() {

System.out.println("in ru");

try {

Thread.sleep(1000);

} catch (Exception e) {

}

d.disp();

}

}

更多请见:https://blog.csdn.net/qq_44639795/article/details/103095424

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档