什么是死锁

死锁指的是,当有两个线程或两个以上的线程,共同请求一些共享资源。但是每个线程互相持有了对方所需的资源,造成了线程之间互相等待资源释放的情况。
此时,如果在没有外力的左右下,线程持有的资源不会释放,就会造成永久等待的情况。这个情况就是死锁。
image.png

满足死锁的四个必要条件

独占互斥

请求的资源在同一时刻里,只能被一个线程持有,其他线程只能等待资源释放后才能抢占资源。

占有不释放且等待

当线程占有了一个共享资源后,在未获取到另一个共享资源的情况下,是不会释放已占有的共享资源。

不可抢占

一个线程不能够抢占已被其他线程占有的共享资源。

循环等待

线程A持有资源01,等待线程B持有的资源02释放;线程B持有资源02,等待线程A持有的资源01释放。
A->B,B->A, 造成了循环等待的情况。

image.png

如何破坏死锁

破坏 占有不释放且等待

可以一次性申请所有的共享资源,这样就不会存在等待共享资源的情况。

破坏 不可抢占

占用部分资源的线程在进一步申请其他资源时,如果申请不到,可以在一定时间内,主动释放它所占有的资源。

循环等待

按共享资源的顺序编号进行申请,资源申请线性化,每个线程申请资源时,先申请序号小的资源,再申请序号大的资源,这样就不会存在循环等待的情况。

具体示例

一次性申请所有资源

一段时间主动释放持有资源

按照资源编号次序申请资源