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
如何排查死锁?注意,面试问过
方法一:
方法二: