多线程死锁工具的使用
死锁案例
public class DeadLockDemo {
/** A锁 */
private static String A = "A";
/** B锁 */
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.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();
}
}
我们应该很容易看的出来,这个程序会发生死锁,但是如何才能检查出来呢?
以下使用两种工具来检测出来。
jconsole 工具的使用
在cmd的命令窗口,jconsole就可以启动 jconsole 的控制台
点击按钮,检测死锁:
可以看出两个线程死锁了。
jstack 的使用
在cmd的命令控制台,使用命令 jps
查看pid的进程号是多少
这边显示的是 17552
使用命令 jstack 17552
,就可以查看当前线程的执行情况,由于在cmd中查看信息不方便
可以使用 jstack 17552 >> DeadLockDemo.txt
将信息打印到 文件 DeadLockDemo.txt
中
截取以下信息:
从中可以看出线程发生了死锁