就是两个线程各自持有一个锁,又想去获取对方的锁(锁中套锁)。自己的持有的锁还没执行完,又要执行另一段被锁的代码。
当一个线程永远地持有一个锁,并且其他线程都尝试去获得这个锁时,那么它们将永远被阻塞,这个我们都知道。如果线程A持有锁L并且想获得锁M,线程B持有锁M并且想获得锁L,那么这两个线程将永远等待下去,这种情况就是最简单的死锁形式。
例子:两个方法中一定让线程睡一会,不然一个线程直接执行完了,另一个线程还没开始执行尴尬了
避免死锁的方式
既然可能产生死锁,那么接下来,讲一下如何避免死锁。
1、让程序每次至多只能获得一个锁。当然,在多线程环境下,这种情况通常并不现实
2、设计时考虑清楚锁的顺序,尽量减少嵌在的加锁交互数量
3、既然死锁的产生是两个线程无限等待对方持有的锁,那么只要等待时间有个上限不就好了。当然synchronized不具备这个功能,但是我们可以使用Lock类中的tryLock()方法去尝试获取锁,这个方法可以指定一个超时时限,在等待超过该时限之后变回返回一个失败信息