乐趣区

关于程序员:什么条件下会产出死锁如何避免死锁

一个去美团面试的小伙伴私我说,被面试官问到一个死锁的问题难道了,面试前还特意刷了题,面试的时候就是脑子一片空白不晓得怎么答复。明天,我给大家彻底讲明确。

1、什么是死锁?
到底什么是死锁呢?

什么条件下会产出死锁,如何防止死锁?
死锁,简略来说就是两个或者两个以上的线程在执行过程中,去抢夺同一个共享资源导致互相期待的景象。如果没有内部干涉,线程会始终处于阻塞状态,无奈往下执行。这样始终期待处于阻塞状态的线程,被称为死锁线程。

2、产生死锁的起因
产生死锁须要同时满足以下四个条件:

什么条件下会产出死锁,如何防止死锁?
第一个:互斥条件,共享资源 a 和 b 只能被一个线程占用;

第二个:申请和放弃条件,线程 T1 曾经获取共享资源 a,在期待共享资源 b 的时候,不开释共享资源 a;

第三个:不可抢占条件,其余线程不能强行抢占线程 T1 占有的资源;

第四个:循环期待条件,线程 T1 期待线程 T2 占有的资源,线程 T2 期待线程 T1 占有的资源,这造成了循环期待。

3、如何防止死锁?
线程产生死锁之后,只能通过内部干涉来解决问题,比方重启程序,或者 Kill 线程。所以,咱们只能在写代码时躲避死锁的产生。那么如何防止死锁产生呢?依据产生死锁的四个必要条件,咱们只须要毁坏其中任何一 个条件就能够解决。

什么条件下会产出死锁,如何防止死锁?
第一个互斥条件是没有方法被毁坏的,因为它是互斥锁的根本束缚。其余三个条件都能够通过人工干预来毁坏。比方申请放弃条件,咱们能够在首次执行一次性申请所有的资源,这样就不存在期待锁的问题了。

第二个,对于不可抢占条件来说,占用局部资源的线程在进一步申请其余资源的时候如果申请不到,咱们能够被动开释它占有的资源。这样不可抢占这个条件就被毁坏了。

第三个,对于循环期待条件来说,能够通过按序申请资源来预防死锁的产生。所谓按序申请,就是给资源编号,所有线程能够依照线性化的序号程序去申请共享资源,先申请须要序号小的,再申请序号大的,这样循环期待天然就不存在了。

以上就是我对死锁的了解,听懂了的小伙伴,请关注点个赞,下次不迷路。

S 信【Tom】或【666】即可收费支付须要更多干货内容,还有海量面试材料,只弹干货不惨水!

本文为“Tom 弹架构”原创,转载请注明出处。技术在于分享,我分享我高兴!
如果本文对您有帮忙,欢送关注和点赞;如果您有任何倡议也可留言评论或私信,您的反对是我保持创作的能源。关注微信公众号『Tom 弹架构』可获取更多技术干货!

关注微信公众号『Tom 弹架构』可获取更多技术干货!往期视频曾经整顿成文档模式,须要的小伙伴点个关注,搜寻下方名片!我是被编程耽搁的文艺 Tom,

退出移动版