Java多线程(六、线程死锁)

我们可以用synchronized关键字来实现线程间的同步,也可以用wait、notfiy、notfiyAll等方法来实现线程间的通信,但是线程间也有可能发生死锁。

先看生活中的一个实例,2个人一起吃饭但是只有一双筷子,2人轮流吃(同时拥有2只筷子才能吃)。某一个时候,一个拿了左筷子,一人拿了右筷子,2个人都同时占用一个资源,等待另一个资源,这个时候甲在等待乙吃完并释放它占有的筷子,同理,乙也在等待甲吃完并释放它占有的筷子,这样就陷入了一个死循环,谁也无法继续吃饭。。。

线程中这样的死循环就是死锁。当一个线程进入了对象X的管程而另一个线程进入了对象Y的管程,如果X的线程试图调用Y线程的同步方法,他会向预料的一样被锁定。而Y也需要调用X线程的同步方法,也会被锁定。这样两个线程都永远等待,因为到达X,必须释放自己的Y的锁定以使第一个线程可以完成。而这样的情况就称为线程死锁。

死锁使很难调试的错误,因为:

  • 通常,它极少发生,只有到两线程的时间段刚好符合时才会发生。
  • 它可能包含多于两个的线程和同步对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值