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自带
这里就会明确提示死锁情况