3.5 死锁及排查
3.5.1 概念
死锁是指两个或两个以上的线程在执行过程中,因抢夺资源而造成的一种互相等待的现象,若无外
力干涉,则它们无法再继续推进下去。
产生原因:
- 系统资源不足
- 进程运行推进顺序不合适
- 系统资源分配不当
3.5.2 写一个死锁代码case
package com.nanjing.gulimall.zhouyimo.test;import java.util.concurrent.TimeUnit;/*** @author zhou* @version 1.0* @date 2023/10/12 9:30 下午*/
public class DeadLockDemo {public static void main(String[] args) {final Object a = new Object();final Object b = new Object();new Thread(() -> {synchronized (a){System.out.println("t1线程持有a锁,试图获取b锁");try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}synchronized (b){System.out.println("t1线程获取到b锁");}}},"t1").start();new Thread(() -> {synchronized (b){System.out.println("t2线程持有a锁,试图获取a锁");try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}synchronized (a){System.out.println("t2线程获取到a锁");}}},"t2").start();}
}
3.5.3 如何排查死锁
纯命令:
jps -l
jstack 进程编号
图形化:
jconsole
如何排查死锁?注意,面试问过
方法一:
方法二: