在学习并发的时候,对于死锁情况的检测有三种方式
测试案例
public class DeadLockDemo {
private static String A = "A";
private static String B = "B";
public static void main(String[] args) {
new DeadLockDemo().deadLock();
}
private void deadLock() {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (A) {
try {
Thread.currentThread().sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (B) {
System.out.println("1");
}
}
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (B) {
synchronized (A) {
System.out.println("2");
}
}
}
});
t1.start();
t2.start();
}
}
jvisualvm
JVM 监控工具,可以监控 CPU ,内存,类,线程等运行状况,实时监控服务器性能
步骤
- 从你的jdk下载目录下,找到bin目录下的jvisualvm.exe
- 双击打开,可以看到运行的java程序
打开jvisualvm时的界面
当,跑起来死锁的demo后左边的目录会有显示,双击可以看到左边详细信息,在线程子界面下,显示检测的了死锁,点击线程Dump可以看具体在哪
显示如下:
jconsole
jconsole是jdk自带的内置java性能分析器,用来监控Java应用程序的性能和跟踪Java中的代码.
步骤
- 可以使用cmd ,输入jconsole,打开
- 可以在jconsole界面看到demo,选择连接本地进程
jconsole界面
连接
在线程子界面,点击检测死锁,就能显示死锁的线程
jstack
jstack是java虚拟机自带的一种堆栈跟踪工具。
步骤
- 先用jps查看进程pid信息
- 使用jstack -l [pid]查看其中的线程信息,可看到Found one Java-level deadlock:及具体的死锁信息展示
演示
输入jps,查看pid,可以看到我的DeadLockDemo的pid是42980。
查看线程信息,使用都jstack -l 42980
最后一个是demo的pid,根据自己的pid填写
它会直接显示到死锁信息部分