什么是死锁?怎么解决死锁问题?

1、什么是死锁

所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。

举个例子

2线程就是两个孩子,2锁其中一个是电池,另一个是电动汽车,a孩子拿着电池,b孩子拿着电动汽车,a想要b的车,b想要a的电池,谁也不肯退,所以谁也玩不上,都僵在那里就是死锁
解决方法,1、一次申请所有资源就是把玩具和电池放一起,只让一个孩子拿到2、主动释放就是有个孩子比较懂事,先让出自己的玩具部分3、玩具给幼儿园老师看着,只有拿到车的才发电池。

两个线程需要两个资源才能进行下去,一线程有一资源,二线程有二资源,一二线程要想进行下去都需要同时拥有两个资源。而双方都不会把手中已经得到的资源放出去,所以双方都不会凑齐两个资源,线程也就不会完成,只会一直等待对方放开资源,形成死锁。

或者说我要去药店买口罩,而进药店需要我带着口罩,这是就僵在这里。除非有外力因素否则不会打破这个情况。

2、死锁产生的4个必要条件?


产生死锁的必要条件:

互斥条件进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。
请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放。
不剥夺条件:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。
环路等待条件:在发生死锁时,必然存在一个进程--资源的环形链。
 

3、解决死锁的基本方法

预防死锁:

资源一次性分配:一次性分配所有资源,这样就不会再有请求了:(破坏请求条件)
只要有一个资源得不到分配,也不给这个进程分配其他的资源:(破坏请保持条件)
可剥夺资源:即当某进程获得了部分资源,但得不到其它资源,则释放已占有的资源(破坏不可剥夺条件)
资源有序分配法:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反(破坏环路等待条件)
 

4、解除死锁:


当发现有进程死锁后,便应立即把它从死锁状态中解脱出来,常采用的方法有:

剥夺资源:从其它进程剥夺足够数量的资源给死锁进程,以解除死锁状态;
撤消进程:可以直接撤消死锁进程或撤消代价最小的进程,直至有足够的资源可用,死锁状态.消除为止;所谓代价是指优先级、运行代价、进程的重要性和价值等。
 

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