模拟死锁场景
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,弹出一个工具窗口。

- 选择对应的本地进程后点击连接,选择工具栏上的线程,找到检测死锁查看是否出现死锁。
756

被折叠的 条评论
为什么被折叠?



