谈到死锁,相信大家都不陌生,耳熟能详了吧,这个死锁无论是在学习中、还是面试中都是必说的一个问题。小编先占用大家时间说下什么是死锁?死锁是指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。举个例子:如2个厨师做饭,徐师傅需要酱油,张师傅需要醋,此时呢,徐师傅在拿着醋,张师傅在拿着酱油,2个人就等着对方谁先放下手里这个东西。一直不放就会一直等下去。
徐师傅
张师傅
死锁
这样就造成死锁了,程序进行不下去了。
死锁的发生必须满足以下四个条件:
互斥条件:一个资源每次只能被一个进程使用。请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
避免死锁最简单的方法就是阻止循环等待条件,将系统中所有的资源设置标志位、排序,规定所有的进程申请资源必须以一定的顺序(升序或降序)做操作来避免死锁。小编这里拿调整锁的范围来避免死锁
缩小死锁范围
除了死锁还有一种情况就是活锁,这个可能大家不是经常被问到,活锁和死锁类似,不同之处在于处于活锁的线程或进程的状态是不断改变的,活锁可以认为是一种特殊的饥饿。一个现实的活锁例子是两个人在狭小的走廊碰到,两个人都试着避让对方好让彼此通过,但是因为避让的方向都一样导致最后谁都不能通过走廊。简单的说就是,活锁和死锁的主要区别是前者进程的状态可以改变但是却不能继续执行。这里在拿张师傅和徐师傅为例,比如张师傅和徐师傅都要进厨房做饭,正赶上做饭点,张师傅认为徐师傅应该先做,徐师傅任务张师傅先做,就这样来回谦让,最后谁也没做。
徐师傅
张师傅
执行
结果
活锁发生的条件:
1、消息重试。当某个消息处理失败的时候,一直重试,但重试由于某种原因,比如消息格式不对,导致解析失败,而它又被重试,这种时候一般是将不可修复的错误不要重试,或者是重试次数限定。
2、相互协作的线程彼此响应从而修改自己状态,导致无法执行下去。比如两个很有礼貌的人在同一条路上相遇,彼此给对方让路,但是又在同一条路上遇到了。互相之间反复地避让下去,这种时候可以选择一个随机退让,使得具备一定的随机性。