3.死锁
2025年09月21日
3.死锁
一旦有多个线程,当它们都要争夺对多个锁的独占访问的时候,这就有可能发生死锁。最常见的死锁形式是当线程1持有对象A上的锁,而且正在等待对象B上的锁,而线程2持有对象B上的锁,却正在等待对象A上的锁。这两个线程都在等待对方释放锁,才能进行下去。这样就造成它们只能永远互相等待。这就好比两个人在吃饭,一个人用刀叉,一个人用筷子。现在,甲拿到了一根筷子和一把刀子,乙拿到了一把叉子和一根筷子,他们都无法吃饭。于是,发生了下面的事件。
甲:“你先给我筷子,我再给你刀子!”
乙:“你先给我刀子,我才给你筷子!”
……
结果可想而知,谁也没吃到饭。
要避免死锁,对于有多个锁的情况,应该确保在所有的线程中都以相同的顺序获取锁。
【代码12.13】模拟产生死锁的例程
代码12.13的运行结果:
main线程开始!
子线程开始!
代码12.13的程序是不能正常结束的,两道线程陷入互相等待的死锁状况,看不到两道线程结束的输出字符串。
当有多个锁时,程序的编写要避免以上的情况。