死锁的出生
- 业余的说在什么的情况下会发生死锁?可能是这种情况:
- 在同一时刻,一条资源只能让一个人获取;
- 先获得资源的人,占有资源时间过长,导致后者等待时间过长;
- 前后获得资源的顺序,形成了闭环
- 专业的说在什么的情况下会发生死锁?必须满足以下条件:
- 互斥条件:一个资源每次只能被一个线程使用。
- 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
- 不剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺。
- 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
死锁的灭亡
- 业余的人这样做:
- 避免在消息队列前后操作同一数据库的表单
- 选用合适的数据库引擎和索引
- 一个业务层方法,不要调用另一个有着操作表单的业务层方法
- and so on…
- 专业的人这样做:
- 打破互斥条件,我们需要允许进程同时访问某些资源,因受制于实际场景,不太容易实现;
- 打破不可抢占条件,这样需要允许进程强行从占有者那里夺取某些资源,或者简单一点理解,占有资源的进程不能再申请占有其他资源,必须释放手上的资源之后才能发起申请,这个其实也很难找到适用场景;
- 进程在运行前申请得到所有的资源,否则该进程不能进入准备执行状态。这个方法看似有点用处,但是它的缺点是可能导致资源利用率和进程并发性降低;
- 避免出现资源申请环路,即对资源事先分类编号,按号分配。这种方式可以有效提高资源的利用率和系统吞吐量,但是增加了系统开销,增大了进程对资源的占用时间。