死锁的典型情况、产生的必要条件和解决方案

前言

死锁:多个线程同时被阻塞,他们中的一个或全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。

目录

前言

一、死锁的三种典型情况

(一)一个线程一把锁

(二)两个线程两把锁

(三)N个线程M把锁

二、死锁产生的必要条件(缺一不可)

(一)互斥使用

(二)不可抢占

(三)请求和保持

(四)循环等待

三、死锁的解决方案


一、死锁的三种典型情况

(一)一个线程一把锁

一个线程一把锁,但是都是不可重入锁。该线程争对这个锁连续加锁就会陷入死锁。如:

死锁的典型情况、产生的必要条件和解决方案_第1张图片 

(二)两个线程两把锁

两个线程两把锁,把这两个线程先分别获取一把锁,然后再同时尝试获取对方的锁。

死锁的典型情况、产生的必要条件和解决方案_第2张图片 

(三)N个线程M把锁

死锁的典型情况、产生的必要条件和解决方案_第3张图片

 

二、死锁产生的必要条件(缺一不可)

(一)互斥使用

一个线程获取到一把锁之后,别的线程不能获取到这个锁。

(二)不可抢占

锁只能被持有者主动释放,而不能被其他线程直接抢走。

(三)请求和保持

一个线程去尝试获取更多的锁,在获取第二把锁的过程中,会对第一把锁始终保持获取状态。

(四)循环等待

t1 尝试获取 locker2,需要t2 执行完,释放 locker2;

t2 尝试获取 locker1,需要t1 执行完,释放 locker1.

三、死锁的解决方案

对于死锁产生的必要条件中,因为他们是缺一不可的,所以解决其中一个条件,死锁的问题就能被解决。解决死锁最关键的要点是第4点

如果对于获取锁有一个编号,并且规定加锁的顺序,那么死锁的问题就可以解决了。如:

我们规定locker1是第一步加锁,locker2是第二步加锁。那么在t1尝试获取locker2的时候,t2仍然处于申请尝试获取locker1的状态中,没有获取locker2,t1对于locker2的获取就会成功。

你可能感兴趣的:(java,java,开发语言)