java中如何检测死锁
首先创建一个程序,写两个线程
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程序
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix