首先熟悉一下jstack命令的用法,主要参数有-F -l -m 如下图:

模拟一段死锁的java代码,如下:
```java
@Slf4j
public class DeadLockMockerimplements Runnable {
/**
* 标识
* flag = 1 , 占用资源L1去获取L2
* flag = 0 , 占用资源L2去获取L1
*/
public boolean flag =false;
/**
* 声明两个资源对象用来获取资源锁
*/
public static ObjectL1 =new Object();
public static ObjectL2 =new Object();
public static void mock() {
DeadLockMocker deadLock1 =new DeadLockMocker();
DeadLockMocker deadLock2 =new DeadLockMocker();
deadLock1.flag =true;
deadLock2.flag =false;
Thread thread1 =new Thread(deadLock1);
Thread thread2 =new Thread(deadLock2);
thread1.start();
thread2.start();
}
@Override
public void run() {
log.info("flag: {}", flag);
// deadLock2占用资源o1,准备获取资源o2
if (flag) {
log.info("准备获取到资源 L1");
synchronized (L1) {
log.info("获取到资源 L1");
try {
Thread.sleep(1000);
}catch (InterruptedException e) {
e.printStackTrace();
}
log.info("准备获取到资源 L2");
synchronized (L2) {
log.info("获取到资源 L2");
}
}
}
// deadLock1占用资源o2,准备获取资源o1
else if (!flag) {
log.info("准备获取到资源 L2");
synchronized (L2) {
log.info("获取到资源 L2");
try {
Thread.sleep(1000);
}catch (InterruptedException e) {
e.printStackTrace();
}
log.info("准备获取到资源 L1");
synchronized (L1) {
log.info("获取到资源 L1");
}
}
}
}
}
```
执行java程序,通过jstack找到死锁的线程和代码信息
网友评论