3.死锁

3.死锁

一旦有多个线程,当它们都要争夺对多个锁的独占访问的时候,这就有可能发生死锁。最常见的死锁形式是当线程1持有对象A上的锁,而且正在等待对象B上的锁,而线程2持有对象B上的锁,却正在等待对象A上的锁。这两个线程都在等待对方释放锁,才能进行下去。这样就造成它们只能永远互相等待。这就好比两个人在吃饭,一个人用刀叉,一个人用筷子。现在,甲拿到了一根筷子和一把刀子,乙拿到了一把叉子和一根筷子,他们都无法吃饭。于是,发生了下面的事件。

甲:“你先给我筷子,我再给你刀子!”

乙:“你先给我刀子,我才给你筷子!”

……

结果可想而知,谁也没吃到饭。

要避免死锁,对于有多个锁的情况,应该确保在所有的线程中都以相同的顺序获取锁。

【代码12.13】模拟产生死锁的例程

代码12.13的运行结果:

main线程开始!

子线程开始!

代码12.13的程序是不能正常结束的,两道线程陷入互相等待的死锁状况,看不到两道线程结束的输出字符串。

当有多个锁时,程序的编写要避免以上的情况。