什么是死锁?
死锁是多个线程在执行过程中,因为争夺资源而造成的一种相互等待的状态。
如果没有外力干涉,它们将永远等待下去,程序无法继续执行。
死锁要满足的四个必要条件:
互斥使用: 一个资源每次只能被一个线程占用。
不可抢占: 线程已获得的资源在没有使用完毕之前,不能强行剥夺,资源只能由资源占有者主动释放。
占有且等待: 一个线程因请求资源而阻塞时,对已获得的资源保持不释放。
循环等待: 线程之间形成一种头尾相接的,循环等待资源的关系。
如何解决死锁?
想要预防和解除死锁,需要避免死锁4个条件同时发生。
例如:
- 破坏循环等待条件,让所有线程在请求资源时按顺序申请资源,避免形成循环等待。
- 一次性分配资源,确保一个线程在启动时就申请到所需的所有资源,避免在运行过程中因资源不够而发生死锁。
- 在请求资源时设置超时,超时后线程可以放弃请求,避免永久等待。
- 或者在请求资源时,不占有任何其他资源,避免线程在等待时占用其他资源,破坏死锁占有且等待条件。