死锁相信做过java开发一段时间的小伙伴们都遇到过吧,今天我们要介绍的就是死锁的一些基础概念及死锁定理,希望看了这篇文章后,大家对死锁能够有着更深的了解,避免再在程序里遇到死锁。
一、死锁基础概念
死锁,就是当两个或以上的线程同时拥有对方需要的资源,谁也不想让谁,导致大家都处理等待状态,没有外力就无法结束,这种状态就叫死锁。举个例子:假设这里有一个线程A,按照先锁a再获得锁b的的顺序获得锁,而在此同时又有另外一个线程B,按照先锁b再锁a的顺序获得锁。这就是死锁
死锁产生条件
1.首先是互斥条件,因为共享资源是只能被一个线程占用的;
2.其次是占有且等待,例如线程 t1 已经取得共享资源 s1,那么在尝试获取共享资源 s2 的时候,不不会释放共享资源 s1的;
3.还有不可抢占的问题,因为其他线程是不能强行抢占线程 t1 占有的资源 s1的;
4.最后可能就是循环等待的问题了,比如说线程 t1 等待线程 t2 占有的资源,线程 t2 等待线程 t1 占有的资源
二、死锁定理
进程的死锁问题可以用有向图进行准备而形象的描述,这种有向图称为系统资源分配图.一个系统资源分配图SRAG可定义为一个二元组,即SRAG=(V,E),其中V是顶点的集合,而E是有向边的集合.顶点集合可分为两种部分:P=(P1,P2,…Pn),是由系统内的所有e79fa5e98193e78988e69d8331333361326337进程组成的集合,每一个Pi代表一个进程;R=(r1,r2,…rm),是系统内所有资源组成的集合,每一个ri代表一类资源。
基于上述资源分配图的定义,可给出判定死锁的法则,又称为死锁定理。
(1) 如果资源分配图中没有环路,则系统没有死锁
(2) 如果资源分配图中出现了环路,则系统中可能存在死锁. 预防死锁的方法:
资源一次性分配:(破坏请求和保持条件)
可剥夺资源:即当某进程新的资源未满足时,释放已占有的资源(破坏不可剥夺条件)
资源有序分配法:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反(破坏环路等待条件)
所以,在系统设计、进程调度等方面需要特别注意如何不让这四个必要条件成立,以及如何确定资源的合理分配的算法,来避免一个线程永久占据系统资源。此外,也要防止进程在处于等待状态的情况下占用资源,在系 统运行过程中,对进程发出的每一个系统能够满足的资源申请进行动态检查,并根据检查结果决定是否分配资源,若分配后系统可能发生死锁,则不予分配,否则予 以分配 。因此,对资源的分配要给予合理的规划。
以上就是今天关于死锁的全部内容了,其实只要你注意代码的编写规范,死锁还是很好避免的,如果你还想了解更多如死锁这样的java入门知识,请持续关注我们的网站了解吧。
推荐阅读: