首页 理论教育 解决死锁问题-Java程序设计 理实一体化教程

解决死锁问题-Java程序设计 理实一体化教程

时间:2023-11-16 理论教育 版权反馈
【摘要】:结果可想而知,两个人都吃不到饭。这个例子中的中国人和美国人相当于不同的线程,筷子和刀叉就相当于锁。两个线程在运行时都在等待对方的锁,这样便造成了程序的停滞,这种现象称为死锁。此时,所有的线程都陷入毫无止境的等待状态中,无法继续运行,这种情况就称为“死锁”。下面通过中国人和美国人吃饭的案例来模拟死锁问题,如文件11-13 所示。文件11-13Eexample13.java执行结果

解决死锁问题-Java程序设计 理实一体化教程

有这样一个场景:一个中国人和一个美国人在一起吃饭,美国人拿了中国人的筷子,中国人拿了美国人的刀叉,两个人开始争执不休:

中国人:“你先给我筷子,我再给你刀叉!”

美国人:“你先给我刀叉,我再给你筷子!”

……

结果可想而知,两个人都吃不到饭。这个例子中的中国人和美国人相当于不同的线程,筷子和刀叉就相当于锁。两个线程在运行时都在等待对方的锁,这样便造成了程序的停滞,这种现象称为死锁。前面已经讲过,为了保证数据安全使用 synchronized 同步机制,当线程进入堵塞状态(不可运行状态和等待状态)时,其他线程无法访问那个加锁对象(除非同步锁被解除),所以一个线程会一直处于等待另一个对象的状态,而另一个对象又会处于等待下一个对象的状态,依此类推,这个线程“等待”状态链会发生很糟糕的情形,即封闭环状态(也就是说最后那个对象在等待第一个对象的锁)。此时,所有的线程都陷入毫无止境的等待状态中,无法继续运行,这种情况就称为“死锁”。虽然这种情况发生的概率很小,一旦出现,程序的调试会变得困难,而且查错也是一件很麻烦的事情。

避免死锁方式:

(1)加锁顺序(线程按照一定的顺序加锁)。(www.xing528.com)

(2)加锁时限(线程尝试获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁)。

(3)死锁检测。

【例11.13】下面通过中国人和美国人吃饭的案例来模拟死锁问题,如文件11-13 所示。

文件11-13 Eexample13.java

执行结果

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈