1.写一个死锁
public static void main(String[] args) {
Object lockA = new Object();
Object lockB = new Object();
new Thread(() -> {
synchronized (lockA) {
System.out.println(Thread.currentThread().getName() + ":持有lockA,希望继续获取lockB");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lockB) {
System.out.println(Thread.currentThread().getName() + ":获取到了lockB");
}
}
}, "A").start();
new Thread(() -> {
synchronized (lockB) {
System.out.println(Thread.currentThread().getName() + ":持有lockB,希望继续获取lockA");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lockA) {
System.out.println(Thread.currentThread().getName() + ":获取到了lockA");
}
}
}, "B").start();
}
2.查看执行过程

可以发现俩线程互相等待,程序无法结束,死锁已经出现
3.那我们如何进一步验证是出现了死锁呢?
第一种:
1.使用Java 自带的命令 jps -l 查看进程编码

2. 使用 jstack 7240 查看具体情况

结果就出来了,A持有950再等960,B持有960再等950
第二种:
使用 jconsole 可视化工具查看,也是java自带




这里就会明确提示死锁情况
本文通过两个线程同步代码块演示了Java中死锁的产生,并介绍了两种方法来检测死锁:使用jps与jstack命令组合,以及利用jconsole可视化工具。
1008

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



