立即学习: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”提交第一个会话事务,数据成功;