学习笔记(09):Java并发编程精讲-线程死锁和避免

立即学习:https://edu.csdn.net/course/play/26270/326861?utm_source=blogtoedu

2020.03.03线程死锁和避免

1.死锁:两个或两个以上的进程执行中,由于资源或彼此通信而造成一种阻塞的现象,若无外力作用,它们将无法推进下去。这些永远在相互等待的进程称为死锁进程;

2.死锁原因:两个及两个以上的资源,抢占两个及以上的锁,抢占的顺序不一致;

3.避免问题:

  • 不适用锁,不适用两把以上的锁;
  • 必须使用两把以上锁时,确保整个应用程序中获取锁的顺序一致;
  • 尝试获取具有超时释放的锁,例如Lock中的tryLock;
  • 当发生java-level的锁时,重启程序来杀死进程/线程;

4.如何获取程序是否有死锁:

  • jps:列举正在运行的虚拟机进程,并显示虚拟机执行的之类以及这些进程的唯一ID,PID;
  • jstack:用于JVM当前时刻的线程快照,得到JVM当前每一条线程正在执行的堆栈信息,定位线程长时间卡顿问题,如死锁、死循环等问题;

5.数据库的死锁问题:

  • 选择数据表,开启两个会话;
  • 每个会话调用,“start transaction”;
  • 第一个会话更新id=1的行;
  • 第二个会话更新id=2的行;
  • 第一个会话更新id=2的行,此时在等待id=2行的锁;
  • 第二个会话更新id=1的行,此时数据库检测死锁,终止触发死锁的失事务,第一个会话的等待状态变为正常状态;
  • 调用“commit”提交第一个会话事务,数据成功;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值