目录
1 死锁是什么?
2 死锁的三种典型情况
3 死锁产生的必要条件编辑
4 如何解决死锁问题
1 死锁是什么?
它是指两个或多个线程因为互相等待对方持有的资源而无法继续执行的情况。换句话说,每个线程都在等待另一个线程释放资源,但没有任何一个线程能够继续执行,导致程序陷入僵局。
生活中的死锁例子:两把钥匙和两个房间
假设你有两个房间,分别是房间A和房间B,每个房间的门上都有一把锁。你有两把钥匙,分别是钥匙A和钥匙B,钥匙A只能开房间A的门,钥匙B只能开房间B的门。
现在,你和你的朋友小明都想进入这两个房间,但是你们手里的钥匙不一样:
-
你手里拿着钥匙A,想先进房间A,然后再进房间B。
-
小明手里拿着钥匙B,想先进房间B,然后再进房间A。
死锁的形成过程
-
你先进房间A:
-
你拿着钥匙A,打开了房间A的门,然后进去锁上了门。
-
这时,你发现自己还需要钥匙B才能进房间B,但钥匙B在小明手里。
-
-
小明先进房间B:
-
小明拿着钥匙B,打开了房间B的门,然后进去锁上了门。
-
这时,小明发现自己还需要钥匙A才能进房间A,但钥匙A在你手里。
-
-
互相等待:
-
你在房间A里,等着小明把钥匙A给你。
-
小明在房间B里,等着你把钥匙B给他。
-
你们俩都在等对方,但谁都不肯先出来,结果就是谁也进不了另一个房间。
-
这就是死锁!
-
你和小明都拿着一把钥匙,但需要对方手里的钥匙才能继续前进。
-
你们都在等对方,但谁都不肯先让步,结果就是大家都被困住了,动弹不得。
总结
死锁就是两个人(或两个线程)互相等对方,结果谁也动不了。在生活中,这种情况很常见,比如两个人互相等对方先让路,结果谁也走不了。在编程里,也是类似的道理,只是换成了线程和资源。
2 死锁的三种典型情况
1.一个线程,一把锁, 但是是不可重入锁. 该线程针对这个锁连续加锁两次,就会出现死锁.
2.两个线程,两把锁. 这两个线程先分别获取到一把锁, 然后再同时尝试获取对方的锁, 这也会出现死锁.
public class Demo25 {private static Object locker1 = new Object();private static Object locker2 = new Object();public static void main(String[] args) {Thread t1 = new Thread(() -> {synchronized (locker1) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}synchronized (locker2) {System.out.println("t1 两把锁加锁成功!");}}});Thread t2 = new Thread(() -> {synchronized (locker2) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}synchronized (locker1) {System.out.println("t2 两把锁加锁成功!");}}});t1.start();t2.start();}
}
3. N个线程M把锁
接下来用一个哲学家就餐问题来举例子
3 死锁产生的必要条件
4 如何解决死锁问题