模拟死锁场景
import java.util.concurrent.TimeUnit;
public class DeadLockDemo {
public static void main(String[] args) {
final Object o1 = new Object();
final Object o2 = new Object();
new Thread(() -> {
synchronized (o1) {
System.out.println(Thread.currentThread().getName() + "自己持有A,希望获取B");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
synchronized (o2) {
System.out.println("成功获取B锁");
}
}
}, "a").start();
new Thread(() -> {
synchronized (o2) {
System.out.println(Thread.currentThread().getName() + "自己持有B,希望获取A");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
synchronized (o1) {
System.out.println("成功获取A锁");
}
}
}, "a").start();
}
}
代码运行后结果出现死锁现象。
解决方案
jps+jstack命令工具
通过java自带jps查看运行的进程,jps是jdk提供的一个查看当前java进程的小工具。
- 运行
jps -l
查看当前运行的java线程 - 运行结果查看
- 找到DeadLockDemo所对应的进程序号
64751
,通过jstack 64751
命令查看当前时刻的线程快照信息。
- 通过最后一行提示
Found 1 deadlock
出现一个死锁。
jconsole
- 在终端直接输入
jconsole
,弹出一个工具窗口。
- 选择对应的本地进程后点击连接,选择工具栏上的线程,找到检测死锁查看是否出现死锁。