什么是死锁?
百度百科上是这么说的:
死锁是指两个或两个以上的进程(线程)在执行过程中,由于竞争资 源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推 进下去。此时称系统处于死锁状态或系统产生 了死锁,这些永远在互相等待的进 程(线程)称为死锁进程(线程)。
举一个例子:
我们有两个资源s1,以及s2
两个线程t1,以及t2
假设t1先抢到了资源s1,并且需要s2,但是t2此时以及把s2资源给拿到了,在等待s1
这个时候t1和t2线程就会相互等待对方释放资源,从而导致了死锁的现象
好,那怎么打破死锁呢?
首先我们得聊一下操作系统对于死锁形成的四个条件的描述:
1.互斥条件:线程拿到资源后,便具有了排他性,这个资源只能被该线程使用,直到它释放这个资源
2.占有并等待:线程至少持有了一个资源,并且正在等待着另外一个资源
3.不剥夺:当线程持有了一个资源后,不能被强行剥夺(也就是不能偷它,哈哈哈)。
4.循环等待:当发生死锁时,参与的线程肯定会形成一个环,都想抢其他的资源,但是又抢不着,死循环。
打破方式:
1.破坏互斥条件:破坏不了,临界资源本来就用于互斥,所以就不从这儿下手了
2.破坏占有并等待条件:一次性申请完所有的资源,这样就不会说导致占有了一个或多个,等待着另一个的情况了
3.破坏不剥夺条件:让持有一部分资源的线程,再申请不到资源的时候主动放弃自己已经获得了的资源
4.破坏循环等待条件:获取临界资源的时候,按照统一的顺序来,比如上述例子,让两个线程都先争夺资源s1,再争夺资源s2.