死锁的总结

什么是死锁

当多个线程或者是进程都在等待其他线程或者进程释放资源,导致所有的线程和进程都无法继续执行称为死锁.

死锁的几个典型场景

  1. 一个线程一把锁(不可重入锁):当一个线程使用了两次加锁(不可重入锁)操作就会形成死锁.
  2. 两个线程两把锁:当两个线程都先获得一把锁并且尝试获得第二把锁.举个例子:当你的车钥匙落在了家里,而家里的钥匙落在了车里,此时就是一个典型的两个线程两把锁形成的死锁.
  3. N个线程M把锁:典型例子就是哲学家就餐问题.五个人五支筷子吃面条.

死锁产生的必要条件

  1. 互斥使用(锁的基本特性):一个线程获取了一把锁后,别的线程就不能在获取这把锁了.
  2. 不可抢夺(锁的基本特性):当一个线程获取这个锁了后,其他线程不可以抢夺,只能等待该线程自己释放锁.
  3. 请求和保持(代码结构):当一个线程尝试获得多把锁的时候,在尝试获取第二把锁的过程中,会保持对第一把锁的获取状态.
  4. 循环等待(代码结构):t1已经上锁locker1尝试获取locker2,需要等待t2执行完释放locker2;t2尝试获取locker1,需要t1执行完释放locker1.

如何解决死锁问题

锁的基本特性我们改变不了,请求和保持如果改动可以会影响到需求.因此只能从循环等待这一点入手.

解决方法也很简单可以通过对锁进行编号,每个线程如果想要获取多把锁必须要先获取编号小的锁,后获取编号大的锁.严格遵守上述顺序就一定不会出现循环等待.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值