多线程加锁原则与死锁分析

多线程加锁原则

  1. 单条线程只同时持有一个锁的情况下,无论多少条线程肯定不会造成死锁
  2. 同时持有多个锁的代码,只要不出现持锁顺序(考虑传递性)相反的情况,无论多少条线程肯定不会出现死锁

死锁分析

非传递性持锁顺序相反的死锁案例

线程2
线程1
申请锁a
申请锁b
释放b
释放a
申请锁b
申请锁a
释放a
释放b
未持锁_3
持锁b
持锁a+b_2
剩余持锁b
未持锁_4
未持锁_1
持锁a
持锁a+b_1
剩余持锁a
未持锁_2
会出现死锁的点

线程1持有锁a等待锁b,线程2持有锁b等待锁a。这种情况下的分析,线程1上锁的顺序是ab,线程2上锁的顺序是ba,持锁顺序相反,代码运行到特定的点会导致死锁的情况出现

传递性下的持锁顺序相反的死锁案例

线程3
线程2
线程1
申请锁a
申请锁b
释放b
释放a
申请锁b
申请锁c
释放c
释放b
申请锁c
申请锁a
释放a
释放c
未持锁_5
持锁c
持锁a+c_1
剩余持锁c
未持锁_6
未持锁_3
持锁b
持锁b+c_1
剩余持锁b
未持锁_4
未持锁_1
持锁a
持锁a+b_1
剩余持锁a
未持锁_2
会出现死锁的点

线程1持有锁a等待锁b,线程2持有锁b等待锁c,线程3持有锁c等待锁a。这种情况,就是传递性情况下持锁顺序相反导致的死锁(就是我们通常说的构成了闭环)。线程1上锁的顺序是ab,线程2上锁的顺序是bc,线程3持锁的顺序为ca。这种情况下的分析,考虑作并线处理分析。将线程1与线程2并线分析,则他们并线后持锁顺序是abc,而线程3的持锁顺序是ca,这里面两边ac锁的顺序相反,代码运行到特定的点会导致死锁的情况出现

死锁故障排查

thread dump死锁的应用,查看死锁线程停止在那个位置,以及其调用栈,如还不能排除问题,有必要进行heap dump,查看内存变量值相关的信息

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值