多线程系列之死锁、活锁、饥饿

死锁

概念 

是指两个或更多的线程在执行过程中,因争夺同一个资源而造成的一种互相等待资源释放的现象,如果按照程序走下去不进行人工干预,这些线程就无法执行下去

出现死锁的原因/背景

  • 互斥条件:就是指进程在某一时间内独占资源,

就好比甲乙丙丁四人去上厕所,甲一直在厕所不出来,乙丙丁就只能等(有一种故意占用厕所整蛊其他人的嫌疑~)

  • 请求与保持条件:就是说某一个进程因为请求资源发生阻塞时,对自己已经获得的资源不释放,

就好比同一个水龙头,甲乙丙丁去接水,甲没有带水杯没办法接水(阻塞了),但是甲又不离开,一直堵在乙丙丁前面,自己没办法喝到水,还不让其他人接水(不释放已有资源)

  • 不剥夺条件:是指进程已经获得资源了,在未使用完之前,不能强行剥夺,和序号1场景差不多,只不过这个获得资源的进程可能正在执行,只是逻辑比较多导致死锁,

就好比接水,甲刚运动完,本来是一人一瓶的,他一个人喝了好几瓶还不够,就导致后面的人只能等他喝过瘾了才能继续接水

  • 循环等待条件:是指很多进程之间形成一种首尾呼应的循环等待关系,

比如,A和B是互为对立的间谍,C是审问官,A觉得B是间谍,但是B又说A是间谍,C问同一个问题的时候,A说:B说我再说,但是B有脾气,B说:A不说,我也不说,A和B彼此都是要说的前提,这样就会一直等待,C审问官啥也问不出来,只能等


活锁

概念 

死锁的相对面,就是人物或执行者在执行过程没有被阻塞,但是可能因为某些条件不满足,导致进程/线程一直在重复的尝试、失败、尝试、失败...

疑问

看完活锁的概念,可能有人就会问了,活锁会不断的尝试、失败然后再尝试,这也不是卡在那里死循环了嘛,这个问题问的超级有质量~

解答

活锁和死活的区别就在于,活锁可以自己跳出来,把自己可能获得的但没用上的资源释放掉,而死锁不能自己释放,只能等待


饥饿 

概念 

一个或者多个线程因为种种原因无法及时获得资源,导致一直无法执行的状态

饥饿出现的原因 

  • 高优先级的线程把所有低级的线程给吞噬了,

就好比食堂打饭,甲因为下课跑得快(先到先得,优先级高),所以是第一个打饭的学生,但是他一个人可以吃完所有食堂的东西,导致后面排队的同学都没饭可吃(有点夸张了,哈哈哈,但有助于理解)

  • 线程被永久堵塞在同一个等待进入同步块的状态,因为其他线程总是能在它之前持续的对该同步块进行访问

就好比甲挤公交车去上班,因为个小力弱,总是挤不上去,就想等着能挤上去(等待进入同步快),后来好不容易挤上去了,被另外一个门上去的大老爷们挤上去产生的压力又给挤下去了(其他线程比它先获得资源),甲再等下一班车来的时候,又是因为在前门挤上去,又被后门挤上去的人给挤下去,以此类推(永久堵塞),甲肯定会迟到,因为公交车总是上不去

  • 线程在等待一个本身也处于永久等待完成的对象,因为其他线程总是被持续的唤醒,

就好比甲还在挤公交,他自身弱,挤不上去,想顺着很魁梧的乙后面一块挤上去,但是乙也总是挤不上去,就导致乙挤不上去,甲也挤不上去

疑问

肯定会有人发现,饥饿的概念听起来和死活也有点像,不过现象是一样的,过程本质有点不同哦~

解答

举个例子,这两者对比,

1、死锁是食堂吃饭,甲一直在吃,不愿意留一粒米给后面的人,哪怕是撑死,后面的人就会造成死锁,就只能一直等甲吃完或者撑死,描述的对象是甲后面的那些人,

2、饥饿是甲一直在吃,乙饿的受不了了,也想吃,但是得等甲吃完(这里异于死锁的甲,这里的甲是可以吃完饭而且还有剩下的部分),但是这个时候,丙丁来了,但是丙丁比较霸道,插在乙前面吃了饭,乙就会造成有饭吃不成,就会饥饿,在队列中,乙算是最前面,按照正常逻辑,乙是能够正常吃到饭的,毕竟排队靠前嘛,但是总是有霸道的或者比乙更饿的人抢在乙前面吃饭,导致乙一直在等前面的人吃完,但是乙前面吃饭的人可能会越来越多甚至等到乙到窗口的时候,乙就没饭吃了,这个例子相对死锁来说,描述的对象是乙

总结:

区别就在于:

  • 持有资源的一个持有周期

死锁是其中一个一直持有不释放,导致后面的进程/线程没办法执行

饥饿是资源正常在释放,本来能持有这个资源,但是因为种种原因获取不到资源,还有

  • 描述的对象不同

死锁描述的是等待资源释放的线程/进程

饥饿描述的是一直被抢先获取资源而导致自己一直没办法获取资源执行下去的线程/进程


上面的理论是我个人结合了生活进行了剖析和理解,如果有什么不妥或者例子不准确再或者是理论有误的地方,希望大家可以留言,共同完善! 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值