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

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

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

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

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

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

猜你喜欢

转载自blog.csdn.net/xkfanhua/article/details/80598060