【并发编程】-- 清除死锁

64 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情

接着上一篇文章 【并发编程】-- 避免死锁(2)

  1. 清除死锁

    如果出现了死锁,应如何清除死锁,清除死锁的思路分为两步,即找到死锁和清除死锁。

    首先,出现死锁说明肯定存在资源依赖,因此可以维护一个资源分配图,每次分配资源后检测一下这个图结构是否存在环,如果存在,则发生了死锁,或者,可以不维护这个图结构,直接判断等待时间,如规定6s内获取不到需要的资源,则判定存在死锁。

    ​ 判定存在死锁后,采取措施是直接释放占有的资源即可。这个破坏了占有资源和不可抢占的条件,一般来说都是释放掉获取资源数最少的那个任务,如a获取了3个资源,还需要两个资源,b获取了两个资源,还需要两个资源。因此b获取的资源少于a.所以优先释放b,这样a就能获取了需要的两个资源。完成任务后,释放的资源再分配给

    b即可。

stop方法

​ stop方法的作用是强制停止线程执行,如果该线程与当前线程不同,当前线程尝试去停止除自身以外的线程,那么安全管理者会调用checkPermission方法可能会抛出一个SecurityException异常停止尚未启动的线程,如果线程最终启动,即会被立即终止。应用程序通常不能尝试去捕获ThreadDeath异常,除非它必须执行一些特殊的清除操作。

​ 注意点:ThreadDeath异常会导致finally代码块,try代码块在线程死亡前执行,如果catch代码块捕获到了ThreadDeath异常,必须抛出ThreadDeath异常,以便线程最终能够死亡。