首先使用jconsole连接上应用
点击死锁 然后会出现两个线程
也就是这两个线程出现了死锁
然后再使用jstack进行分析具体是哪一行代码出现死锁
jstack -l 18404
这个就写的比较明白了 线程1 卡在 DeadLock 43行代码 而 线程 2卡在DeadLock 56行代码
最后附上我测试使用的java DeadLock代码
package tt;
/**
* Created by zh on 2017/9/18.
*/
public class DeadLock {
public static void main(String[] args) {
Container container = new Container();
Runnable r = () -> {
try {
container.method1();
} catch (InterruptedException e) {
e.printStackTrace();
}
};
Runnable r2 = () -> {
try {
container.method2();
} catch (InterruptedException e) {
e.printStackTrace();
}
};
new Thread(r,"线程1").start();
new Thread(r2,"线程2").start();
}
}
class Container{
private Object lock1 = new Object();
private Object lock2 = new Object();
public void method1() throws InterruptedException {
while (true){
synchronized (lock1){
//暂停1秒
Thread.sleep(1000);
synchronized (lock2){
System.out.println("method1正在执行");
}
}
}
}
public void method2() throws InterruptedException {
while (true){
synchronized (lock2){
//暂停1秒
Thread.sleep(5);
synchronized (lock1){
System.out.println("method2正在执行");
}
}
}
}
}