什么是死锁
死锁指的是,当有两个线程或两个以上的线程,共同请求一些共享资源。但是每个线程互相持有了对方所需的资源,造成了线程之间互相等待资源释放的情况。
此时,如果在没有外力的左右下,线程持有的资源不会释放,就会造成永久等待的情况。这个情况就是死锁。
满足死锁的四个必要条件
独占互斥
请求的资源在同一时刻里,只能被一个线程持有,其他线程只能等待资源释放后才能抢占资源。
占有不释放且等待
当线程占有了一个共享资源后,在未获取到另一个共享资源的情况下,是不会释放已占有的共享资源。
不可抢占
循环等待
线程A持有资源01,等待线程B持有的资源02释放;线程B持有资源02,等待线程A持有的资源01释放。
A->B,B->A, 造成了循环等待的情况。
如何破坏死锁
破坏 占有不释放且等待
可以一次性申请所有的共享资源,这样就不会存在等待共享资源的情况。
破坏 不可抢占
占用部分资源的线程在进一步申请其他资源时,如果申请不到,可以在一定时间内,主动释放它所占有的资源。
循环等待
按共享资源的顺序编号进行申请,资源申请线性化,每个线程申请资源时,先申请序号小的资源,再申请序号大的资源,这样就不会存在循环等待的情况。