两种方式
- 使用jstack -l
- 使用arthas
在arthas环境下运行thread -b 即可,见下图
arthas安装见官网 https://arthas.gitee.io/install-detail.html
测试代码如下
package com.dong;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 死锁验证
*/
@Slf4j
public class DeadLockTest {
public static void main(String[] args) throws InterruptedException {
Object lock1 = new Object();
Object lock2 = new Object();
Thr one = new Thr(lock1, lock2);
Thr other = new Thr(lock2, lock1);
ExecutorService executorService = Executors.newFixedThreadPool(3);
executorService.submit(one);
executorService.submit(other);
executorService.submit(() -> {
log.info("nothing...");
});
while (true) {
Thread.sleep(5000);
log.info("alive...");
}
}
public static class Thr implements Runnable {
private Object obj1;
private Object obj2;
public Thr(Object obj1, Object obj2) {
this.obj1 = obj1;
this.obj2 = obj2;
}
@SneakyThrows
public void run() {
log.info("begin: {}, {}", obj1, obj2);
synchronized (obj1) {
Thread.sleep(2000);
synchronized (obj2) {
log.info("success...");
}
}
}
}
}