前言
死锁:多个线程同时被阻塞,他们中的一个或全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。
目录
前言
一、死锁的三种典型情况
(一)一个线程一把锁
(二)两个线程两把锁
(三)N个线程M把锁
二、死锁产生的必要条件(缺一不可)
(一)互斥使用
(二)不可抢占
(三)请求和保持
(四)循环等待
三、死锁的解决方案
一、死锁的三种典型情况
(一)一个线程一把锁
一个线程一把锁,但是都是不可重入锁。该线程争对这个锁连续加锁就会陷入死锁。如:
(二)两个线程两把锁
两个线程两把锁,把这两个线程先分别获取一把锁,然后再同时尝试获取对方的锁。
(三)N个线程M把锁
二、死锁产生的必要条件(缺一不可)
(一)互斥使用
一个线程获取到一把锁之后,别的线程不能获取到这个锁。
(二)不可抢占
锁只能被持有者主动释放,而不能被其他线程直接抢走。
(三)请求和保持
一个线程去尝试获取更多的锁,在获取第二把锁的过程中,会对第一把锁始终保持获取状态。
(四)循环等待
t1 尝试获取 locker2,需要t2 执行完,释放 locker2;
t2 尝试获取 locker1,需要t1 执行完,释放 locker1.
三、死锁的解决方案
对于死锁产生的必要条件中,因为他们是缺一不可的,所以解决其中一个条件,死锁的问题就能被解决。解决死锁最关键的要点是第4点。
如果对于获取锁有一个编号,并且规定加锁的顺序,那么死锁的问题就可以解决了。如:
我们规定locker1是第一步加锁,locker2是第二步加锁。那么在t1尝试获取locker2的时候,t2仍然处于申请尝试获取locker1的状态中,没有获取locker2,t1对于locker2的获取就会成功。