死锁的产生和定位分析
Linux ps -ef|grep XXXX ls -l
Windows 下的java运行程序 也有类似的ps的查看进程的命令,但是目前我们需要查看的只是java jps = java ps jps -l
死锁的定位分析方法:
- jps命令定位进程号
- jstack找到死锁查看
本地jdk1.8 binm目录下的两组参数命令
死锁:
死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一.种 互相等待的现象,若无外力干涉那它们都将无法推进下去
package com.youliao.thread;
import lombok.SneakyThrows;
import java.util.concurrent.TimeUnit;
/**
* @Author Dali
* @Date 2021/5/27 9:38
* @Version 1.0
* @Description: 死锁编码及定位分析
* <p>
* 死锁是指两个或两个以上的进程在执行过程中,
* 因争夺资源而造成的一.种 互相等待的现象,
* 若无外力干涉那它们都将无法推进下去
*/
class HoldLockThread implements Runnable {
private String lockA;
private String lockB;
public HoldLockThread(String lockA, String lockB) {
this.lockA = lockA;
this.lockB = lockB;
}
@SneakyThrows
@Override
public void run() {
synchronized (lockA) {
System.out.println(Thread.currentThread().getName() + "\t 自己持有:" + lockA + "\t 尝试获得:" + lockB);
//暂停一会线程
TimeUnit.SECONDS.sleep(2);
synchronized (lockB) {
System.out.println(Thread.currentThread().getName() + "\t 自己持有:" + lockB + "\t 尝试获得:" + lockA);
}
}
}
}
public class DeadLockDemo {
public static void main(String[] args) {
String lockA = "lockA";
String lockB = "lockB";
// new Thread(()->{ },"ThreadAAA").start(); Lambda表达式写法
new Thread(new HoldLockThread(lockA, lockB), "ThreadAAA").start();
new Thread(new HoldLockThread(lockB, lockA), "ThreadBBB").start();
/**
* Linux ps -ef|grep XXXX ls -l
* Windows 下的java运行程序 也有类似的ps的查看进程的命令,但是目前我们需要查看的只是java
* jps = java ps jps -l
*/
}
}
死锁产生运行结果 :
如何排查死锁
当我们出现死锁的时候,首先需要使用jps -l命令查看运行的程序
我们能看到DeadLockDemo这个类,一直在运行
在使用jstack查看堆栈信息
通过查看最后一行,我们看到 Found 1 deadlock,即存在一个死锁