【Mysql】什么是死锁?如何避免死锁
死锁
1. 什么是死锁(争抢资源、互相等待)
多线程因为争抢资源而出现的互相等待的状态
2. 死锁产生的四个必要条件
1. 互斥
当资源被一个线程使用(占有)时,别的线程不能使用(如:张三拿到了苹果,李四就不能拿苹果了)
2. 不可抢占
资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放(如:李四不能从张三手里抢苹果,只能等张三主动放弃苹果)
3. 请求和保持
当资源请求者在请求其他的资源的同时保持对原有资源的占有(如:张三拿到了苹果,他还可以去那香蕉,并不冲突)
4. 循环等待
存在一个等待队列(如张三等李四的香蕉,李四在等张三的苹果,僵住了)
3. 如何避免死锁
打破上诉四个必要条件其中一个(除了互斥),就可以有效避免死锁
- 破坏“请求和保持”条件:所有的进程在开始运行之前,必须一次性的申请其在整个运行过程各种所需要的全部资源
- 破坏“不可抢占”条件:当一个已经持有了资源的进程在提出新的资源请求没有得到满足时,它必须释放已经保持的所有资源,待以后需要使用的时候再重新申请
- 破坏“循环等待”条件:可以通过定义资源类型的线性顺序来预防,可以将每个资源编号,当一个进程占有编号为i 的资源时,那么它下一次申请资源只能申请编号大于i 的资源。
下一篇:
什么是锁?死锁的三种情况及解决办法