死锁

文章插图
思维导图
是什么线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行 。
当线程进入对象的synchronized代码块时,便占有了资源,直到它退出该代码块或者调用wait方法,才释放资源,在此期间,其他线程将不能进入该代码块 。
当线程互相持有对方所需要的资源时,会互相等待对方释放资源,如果线程都不主动释放所占有的资源,将产生死锁 。
发生的必要条件当然死锁的产生是必须要满足一些特定条件的:
1.互斥条件:进程对于所分配到的资源具有排它性,即一个资源只能被一个进程占用,直到被该进程释放
2.请求和保持条件:一个进程因请求被占用资源而发生阻塞时,对已获得的资源保持不放 。
3.不剥夺条件:任何一个资源在没被该进程释放之前,任何其他进程都无法对他剥夺占用
4.循环等待条件:当发生死锁时,所等待的进程必定会形成一个环路(类似于死循环),造成永久阻塞 。
死锁的预防前面介绍了死锁发生时的四个必要条件,只要破坏这四个必要条件中的任意一个条件,死锁就不会发生 。这就为我们解决死锁问题提供了可能 。一般地,解决死锁的方法分为死锁的预防,避免,检测与恢复三种(注意:死锁的检测与恢复是一个方法) 。我们将在下面分别加以介绍 。
死锁的预防是保证系统不进入死锁状态的一种策略 。它的基本思想是要求进程申请资源时遵循某种协议,从而打破产生死锁的四个必要条件中的一个或几个,保证系统不会进入死锁状态 。
1. 打破互斥条件 。即允许进程同时访问某些资源 。但是,有的资源是不允许被同时访问的,像打印机等等,这是由资源本身的属性所决定的 。
所以,这种办法并无实用价值 。
2. 打破不可抢占条件 。即允许进程强行从占有者那里夺取某些资源 。
就是说,当一个进程已占有了某些资源,它又申请新的资源,但不能立即被满足时,它必须释放所占有的全部资源,以后再重新申请 。
它所释放的资源可以分配给其它进程 。这就相当于该进程占有的资源被隐蔽地强占了 。
这种预防死锁的方法实现起来困难,会降低系统性能 。
3. 打破占有且申请条件 。可以实行资源预先分配策略 。即进程在运行前一次性地向系统申请它所需要的全部资源 。
如果某个进程所需的全部资源得不到满足,则不分配任何资源,此进程暂不运行 。
只有当系统能够满足当前进程的全部资源需求时,才一次性地将所申请的资源全部分配给该进程 。
由于运行的进程已占有了它所需的全部资源,所以不会发生占有资源又申请资源的现象,因此不会发生死锁 。
但是,这种策略也有如下缺点:
(1)在许多情况下,一个进程在执行之前不可能知道它所需要的全部资源 。这是由于进程在执行时是动态的,不可预测的;
(2)资源利用率低 。无论所分资源何时用到,一个进程只有在占有所需的全部资源后才能执行 。即使有些资源最后才被该进程用到一次,但该进程在生存期间却一直占有它们,造成长期占着不用的状况 。这显然是一种极大的资源浪费;
(3)降低了进程的并发性 。因为资源有限,又加上存在浪费,能分配到所需全部资源的进程个数就必然少了 。
4. 打破循环等待条件,实行资源有序分配策略 。采用这种策略,即把资源事先分类编号,按号分配,使进程在申请,占用资源时不会形成环路 。
所有进程对资源的请求必须严格按资源序号递增的顺序提出 。
进程占用了小号资源,才能申请大号资源,就不会产生环路,从而预防了死锁 。
这种策略与前面的策略相比,资源的利用率和系统吞吐量都有很大提高,但是也存在以下缺点:
(1)限制了进程对资源的请求,同时给系统中所有资源合理编号也是件困难事,并增加了系统开销;
(2)为了遵循按编号申请的次序,暂不使用的资源也需要提前申请,从而增加了进程对资源的占用时间 。

文章插图
死锁
死锁的避免上面我们讲到的死锁预防是排除死锁的静态策略,它使产生死锁的四个必要条件不能同时具备,从而对进程申请资源的活动加以限制,以保证死锁不会发生 。
推荐阅读
- 兆 宽带中的“M”是什么意思?
- 绿豆汤为什么煮出来是红色的有毒吗 北方绿豆汤为什么煮出来是红色的
- 蚊子怕空调冷风吗 为什么蚊子怕空调
- 如何自己动手更换运营商宽带光猫,需要注意什么?
- 飞机的轨道是什么样的 飞机飞行的轨道是怎么样的
- 方便面面算不算垃圾食品 请问方便面是属于垃圾食品吗
- 50年代红印圆茶,鼎兴圆茶是什么茶
- |三十多岁女子出轨,起因是老公出国出差,难道就不值得同情嘛
- 柯基和哈士奇配出来的狗是什么样的 哈士奇和主人吵架
- 安化天尖黑茶功效,安化黑茶的含梗量是多少
