死锁与活锁的区别,死锁与饥饿的区别

第一次玩属于自己的博客,今天在一个App上看到的,说的很好,再敲了一遍,分享一下有关于死锁、活锁及饥饿的概念和区别,希望大家共同进步!

死锁:是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
死锁发生的四个条件
1、互斥条件:线程对资源的访问是排他性的,如果一个线程对占用了某资源,那么其他线程必须处于等待状态,直到资源被释放。
2、请求和保持条件:线程T1至少已经保持了一个资源R1占用,但又提出对另一个资源R2请求,而此时,资源R2被其他线程T2占用,于是该线程T1也必须等待,但又对自己保持的资源R1不释放。
3、不剥夺条件:线程已获得的资源,在未使用完之前,不能被其他线程剥夺,只能在使用完以后由自己释放。
4、环路等待条件:在死锁发生时,必然存在一个“进程-资源环形链”,即:{p0,p1,p2,...pn},进程p0(或线程)等待p1占用的资源,p1等待p2占用的资源,pn等待p0占用的资源。(最直观的理解是,p0等待p1占用的资源,而p1而在等待p0占用的资源,于是两个进程就相互等待)

活锁:是指线程1可以使用资源,但它很礼貌,让其他线程先使用资源,线程2也可以使用资源,但它很绅士,也让其他线程先使用资源。这样你让我,我让你,最后两个线程都无法使用资源。

关于“死锁与活锁”的比喻:
死锁:迎面开来的汽车A和汽车B过马路,汽车A得到了半条路的资源(满足死锁发生条件1:资源访问是排他性的,我占了路你就不能上来,除非你爬我头上去),汽车B占了汽车A的另外半条路的资源,A想过去必须请求另一半被B占用的道路(死锁发生条件2:必须整条车身的空间才能开过去,我已经占了一半,尼玛另一半的路被B占用了),B若想过去也必须等待A让路,A是辆兰博基尼,B是开奇瑞QQ的屌丝,A素质比较低开窗对B狂骂:快给老子让开,B很生气,你妈逼的,老子就不让(死锁发生条件3:在未使用完资源前,不能被其他线程剥夺),于是两者相互僵持一个都走不了(死锁发生条件4:环路等待条件),而且导致整条道上的后续车辆也走不了。
例如:马路中间有条小桥,只能容纳一辆车经过,桥两头开来两辆车A和B,A比较礼貌,示意B先过,B也比较礼貌,示意A先过,结果两人一直谦让谁也过不去。

饥饿:是指如果线程T1占用了资源R,线程T2又请求封锁R,于是T2等待。T3也请求资源R,当T1释放了R上的封锁后,系统首先批准了T3的请求,T2仍然等待。然后T4又请求封锁R,当T3释放了R上的封锁之后,系统又批准了T4的请求......,T2可能永远等待。

关于”饥饿“的比喻:
在“首堵”北京的某一天,天气阴沉,空气中充斥着雾霾和地沟油的味道,某个苦逼的临时工交警正在处理塞车,有两条道A和B上都堵满了车辆,其中A道堵的时间最长,B相对相对堵的时间较短,这时,前面道路已疏通,交警按照最佳分配原则,示意B道上车辆先过,B道路上过了一辆又一辆,A道上排队时间最长的确没法通过,只能等B道上没有车辆通过的时候再等交警发指令让A道依次通过,这也就是ReentrantLock显示锁里提供的不公平锁机制(当然了,ReentrantLock也提供了公平锁的机制,由用户根据具体的使用场景而决定到底使用哪种锁策略),不公平锁能够提高吞吐量但不可避免的会造成某些线程的饥饿。

原文地址:https://www.cnblogs.com/maohuidong/p/10016074.html

时间: 2024-11-05 21:52:56

死锁与活锁的区别,死锁与饥饿的区别的相关文章

死锁和活锁,饿死,阻塞

以下个人理解,请各位前辈多多指教: 死锁: 解释: 线程A或者B需要过独木桥(使用该进程),而C还没有走完(进程还在占用),于是三方僵死;         也可以是没有C 的情况下,A和B互不礼让僵死.         A和B都认为自己优先级最高应该使用该进程.活锁:解释:线程A和B都需要过桥(都需要使用进程),而都礼让不走(那到的系统优先级相同,都认为不是自己优先级高),就这么僵持下去. 饿死: 解释:这是个独木桥(单进程),桥上只能走一个人,B来到时A在桥上,B等待;        而此时比

多线程<二>死锁,活锁,饿死,阻塞的理解

死锁 死锁 线程A或者B需要过独木桥(使用该进程),而C还没有走完(进程还在占用),于是三方僵死: 也可以是没有C 的情况下,A和B互不礼让僵死. A和B都认为自己优先级最高应该使用该进程. 活锁 活锁 线程A和B都需要过桥(都需要使用进程),而都礼让不走(那到的系统优先级相同,都认为不是自己优先级高),就这么僵持下去. 饿死 饿死 这是个独木桥(单进程),桥上只能走一个人,B来到时A在桥上,B等待:而此时比B年龄小的C来了,B让C现行(A走完后系统把进程分给了C),C上桥后,D又来了,B又让D

死锁的条件以及如何处理死锁问题

死锁的条件以及如何处理死锁问题 解答:互斥条件(Mutual exclusion): 1.资源不能被共享,只能由一个进程使用. 2.请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源. 3.非剥夺条件(No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺. 4.循环等待条件(Circular wait):系统中若干进程组成环路,该环路中每个进程都在等待相邻进程正占用的资源. 如何处理死锁问题: 1.忽略该问题.例如鸵鸟算法,该算法可以应用

定位数据库死锁,和初步解决死锁办法(后发制人)

1.目前我只是在sql 2008上实验成功: 在数据库开启跟踪标识: DBCC TRACEON(1204,-1)DBCC TRACEON(1222,-1) 这两个跟踪标记都是将死锁写到错误日志中,不过1204是以文本格式进行,而1222是以XML格式保存. 开启后通过查看数据库日志文件就可以找到是那个语句引发死锁. 1.模拟一个死锁: 1 DBCC TRACEON(1204,-1) 2 DBCC TRACEON(1222,-1) 3 4 CREATE TABLE Lock1(C1 int def

Java死锁范例以及如何分析死锁(转载自ImportNew)

本文由 ImportNew - 范琦琦 翻译自 journaldev.欢迎加入翻译小组.转载请见文末要求. 死锁是两个甚至多个线程被永久阻塞时的一种运行局面,这种局面的生成伴随着至少两个线程和两个或者多个资源.在这里我已写好一个简单的程序,它将会引起死锁方案然后我们就会明白如何分析它. Java死锁范例 ThreadDeadlock.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

shell逻辑运算总结, 包括[[]]与[]的区别,&&与-a的区别,||与-o的区别

1. 关于文件和目录 -f  判断某普通文件是否存在 -d  判断某目录是否存在 -b  判断某文件是否块设备 -c  判断某文件是否字符设备 -S  判断某文件是否socket(待修正) -L  判断某文件是否为符号链接(待修正) -e  判断某东西是否存在(待修正) -p  判断某文件是否为pipe 或是 FIFO 2. 关于文件的属性 -r  判断文件是否为可读的属性 -w  判断文件是否为可以写入的属性 -x  判断文件是否为可执行的属性 -s  判断文件是否为非空白文件 -u  判断文

mouseover与mouseenter与mousemove的区别mouseout与mouseleave的区别

<html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> <script src="script/jquery-1.11.0.min.js" type="text/javascript"></script> <script type="text/javascript">

YV12和I420的区别 yuv420和yuv420p的区别(转)

原文转自 https://blog.csdn.net/dgyanyong/article/details/44491253 YV12和I420的区别        一般来说,直接采集到的视频数据是RGB24的格式,RGB24一帧的大小size=width×heigth×3 Bit,RGB32的size=width×heigth×4,如果是I420(即YUV标准格式4:2:0)的数据量是 size=width×heigth×1.5 Bit.       在采集到RGB24数据后,需要对这个格式的数

&amp; 和 &amp;&amp; 区别和联系,| 和 || 区别和联系

& 和 && 区别和联系,| 和 || 区别和联系,实际项目中,什么情况用哪种? 首先,& 和 && 的联系(共同点): & 和 && 都可以用作 逻辑与 运算符,但是要看使用时的具体条件来决定. 情况1:当上述的操作数是boolean类型变量时,& 和 && 都可以用作逻辑与运算符. 情况2:当上述的表达式是boolean类型变量时,& 和 && 都可以用作逻辑与运算符. 表示逻辑与(