死锁案例
public class Test001 {
final static Object obj = new Object();
final static Object obj2 = new Object();
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(2);
executorService.execute(()->get());
executorService.execute(()->get2());
}
public static void get(){
synchronized (obj){
System.out.println("线程:"+Thread.currentThread().getName()+" 持有了锁- obj ,等待持有- obj2");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj2){
System.out.println("线程:"+Thread.currentThread().getName()+" 持有了锁- obj2");
}
}
}
public static void get2(){
synchronized (obj2){
System.out.println("线程:"+Thread.currentThread().getName()+" 持有了锁- obj2 ,等待持有- obj");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj){
System.out.println("线程:"+Thread.currentThread().getName()+" 持有了锁- obj");
}
}
}
}
那么如何排查死锁呢,这里就来说三种方式。
排查死锁的三种方式
jstack
首先通过jdk的jps
命令,来看下java进程,找到对应的进程Id。
然后执行jstack
命令,如下:
jstack 30412
往下翻,会看到
说明发现一个死锁
jconsole
采用jdk自带的jconsole来看死锁
连接之后,是如下界面
点击线程
,进入如下界面
接着点击检测死锁
,即可
visualVM
采用jdk自带的visualVM来看死锁
进来之后,点击线程
进来之后,就会自动检测死锁了,如下图