首先创建一个程序,写两个线程
public class 死锁 {
private static final String lock1 = "lock1";
private static final String lock2 = "lock2";
public static void main(String[] args) {
Thread thread1 = new Thread(() -> {
while (true) {
synchronized (lock1) {
try {
System.out.println(Thread.currentThread().getName() + lock1);
Thread.sleep(1000);
synchronized (lock2){
System.out.println(Thread.currentThread().getName() + lock2);
}
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
});
Thread thread2 = new Thread(() -> {
while (true) {
synchronized (lock2) {
try {
System.out.println(Thread.currentThread().getName() + lock2);
Thread.sleep(1000);
synchronized (lock1){
System.out.println(Thread.currentThread().getName() + lock1);
}
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
});
thread1.start();
thread2.start();
}
}
方法1:使用jstack
jstack是java虚拟机自带的一种堆栈跟踪工具。
- 先用jps查看进程pid信息
- 使用jstack -l [pid]查看其中的线程信息,可看到Found one Java-level deadlock:及具体的死锁信息展示
方法2:使用jconsole
jconsole是jdk自带的内置java性能分析器,用来监控Java应用程序的性能和跟踪Java中的代码.
- 可以使用cmd ,输入jconsole,打开
- 可以在jconsole界面看到demo,选择连接本地进程
方法3:jvisualvm
JVM 监控工具,可以监控 CPU ,内存,类,线程等运行状况,实时监控服务器性能
- 从你的jdk下载目录下,找到bin目录下的jvisualvm.exe
- 双击打开,可以看到运行的java程序