本人免费整理了Java高级资料,涵盖了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo高并发分布式等教程,一共30G,需要自己领取。
传送门:https://mp.weixin.qq.com/s/JzddfH-7yNudmkjT0IRL8Q
《“死锁”四个必要条件的合理解释》分为三个部分:
【1】“死锁”的含义
【2】“死锁”的原因及四个必要条件的合理解释
【3】“死锁”的预防和解除
1.“死锁”的含义
所谓死锁: 是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
2.“死锁”产生的原因以及四个必要条件的合理解释
产生死锁的原因可归结为如下两点:
(1)竞争资源。当系统中供多个进程共享的资源如打印机、公用队列等,其数目不足以满足进程的需要时,会引起诸进程的竞争而产生死锁。
(2)进程间推进顺序非法。进程在运行过程中,请求和释放资源的顺序不当,也同样会导致产生进程死锁。
产生死锁的四个必要条件:
1.互斥(Mutual exclusion):存在这样一种资源,它在某个时刻只能被分配给一个执行绪(也称为线程)使用;
2.持有(Hold and wait):当请求的资源已被占用从而导致执行绪阻塞时,资源占用者不但无需释放该资源,而且还可以继续请求更多资源;
3.不可剥夺(No preemption):执行绪获得到的互斥资源不可被强行剥夺,换句话说,只有资源占用者自己才能释放资源;
4.环形等待(Circular wait):若干执行绪以不同的次序获取互斥资源,从而形成环形等待的局面,想象在由多个执行绪组成的环形链中,每个执行绪都在等待下一个执行绪释放它持有的资源。
发现到目前为止,所有的内容都可以在课本书籍、百度、论坛、博客上找到,似乎是教条的罗列。
我们发现看过多次,但每每需要的时候(开发、笔试、面试)却总要回头再看~难以摆脱遗忘、记忆的循环~我觉得产生这种现象的原因是因为:停留在机械记忆。
因为我们的教科书、论坛、博客的内容十有八九在罗列这些概念~但很少有进一步解释、阐释其存在的必然(四个必然条件为什么不多一个,又为什么不少一个?)及其内在逻辑。
或许下面的阐释能让你再遇到这个问题时,可以不翻教科书,不上网百度就能侃侃而谈~
<1>.“死锁”产生有几个必要条件?
“死锁”中“死”音通“四”是四个条件。(虽然很牵强,但对于识记,你会发现很有用!)
<2>.“四”锁的必要条件都是指哪些?
1.资源互斥性(资源的属性,不会同时属于/分配给多个进程)->2.持有和等待(进程被分配(持有)资源后而且在等待(申请)其他资源)->3不可剥夺(对于已分配的资源,不可再强制收回来)->4.环形等待(进程之间资源等待形成相互依赖,互不礼让)
用再通俗的话,进一步解释这个逐渐升级的状况。1->2->3->4是资源分配逐渐条件递进、加强、升级的过程:资源是互斥的每次属于一个进程(1.互斥);
资源分配了我占着而且我还要申请其他资源(2.持有和等待);
我占着的资源你没法拿,你占着的资源我没法拿(3.不可剥夺);
我申请的资源在你那,你申请的资源在我这(4.循环等待),最终形成了一个相互占有、相互等待的僵持局面~
3.“死锁”的预防和解除
理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和解除死锁,消除产生死锁的四个必要条件中的任何一个都可以预防和解除死锁。
不难看出,在死锁的四个必要条件中,第二、三和四项条件比较容易消除。
1、静态分配:采用资源静态分配策略(进程资源静态分配方式是指一个进程在建立时就分配了它需要的全部资源),破坏"部分分配"条件;
2、可剥夺:允许进程剥夺使用其他进程占有的资源,从而破坏"不可剥夺"条件;
3、有序分配:采用资源有序分配法,破坏"环路"条件。