本文共 1799 字,大约阅读时间需要 5 分钟。
线程死锁是指由于两个或多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行。当线程进入对象的synchronized代码块时,便占有了资源,直到它退出该代码块或者调用wait方法,才释放资源。在此期间,其他线程将不能进入该代码块。当线程互相持有对方所需要的资源时,会互相等待对方释放资源,如果线程都不主动释放所占有的资源,将产生死锁。
要产生死锁,必须同时满足以下条件:
如果上述情况中的任何一个条件不成立,死锁就不会发生。破坏其中任意一个条件可以解决死锁问题。
为了避免死锁,可以采取以下措施:
一个银行家共有20亿财产。第一个开发商已贷款15亿,资金紧张还需3亿。第二个开发商已贷款5亿,运转良好能收回。第三个开发商欲贷款18亿。
在这种情况下,如果你是银行家,你应该如何处理?一个常规的想法是先等待第二个开发商收回5亿,然后再将3亿贷款给第一个开发商,等其收回18亿后,再将钱贷款给第三个开发商。
允许进程动态地申请资源,但在每次实施资源分配之前,先计算资源分配的安全性。如果此次资源分配安全,即资源分配后,系统能按某种顺序来为每个进程分配其所需的资源,直至满足所有进程的最大需求,使每个进程都能顺利完成任务,那么便将资源分配给进程,否则不分配资源,让进程等待。
上述矩阵间满足关系:Need[i,j] = Max[i,j] - Allocation[i,j]。
每次资源请求时,系统检查:
每种资源类型都有一个资源。例如,打印机是一个资源,但不会超过一个。
如果存在一个或多个环,说明存在死锁,处于环中的任意一个进程都是死锁进程。如果有多种相同的资源,需要采用矩阵方法检测死锁。构造一个矩阵,检测从P1到Pn的死锁。
构造两个数组:C(当前分配矩阵)和 R(请求矩阵)。Cj表示进程Pi持有资源j的数量。Rij表示进程Pi请求的资源j的数量。
通过向量比较和标记,检测是否存在环。未被标记的进程判定为死锁进程。最简单的解决办法是使用鸵鸟算法,假装死锁根本不存在。
工程师认为死锁发生的概率很低,可能由其他系统故障引起,优先解决其他问题。转载地址:http://ipuiz.baihongyu.com/