文章目录

  • ​​1、什么是死锁​​
  • ​​2、产生死锁的原因​​
  • ​​3、死锁演示​​
  • ​​4、验证是否是死锁​​

1、什么是死锁

两个或两个以上进程在执行过程中,因为争夺资源而造成一种互相等待的现象,如果没有外力干涉,它们无法再执行下去。

死锁案例演示_死锁

2、产生死锁的原因

  • 系统资源不足
  • 进程运行推进顺序不合适
  • 资源分配不当

3、死锁演示

import java.util.concurrent.TimeUnit;

/**
* 演示死锁
*/
public class DeadLock {

//创建两个对象
static Object a = new Object();
static Object b = new Object();

public static void main(String[] args) {
new Thread(()->{
synchronized (a) {
System.out.println(Thread.currentThread().getName()+" 持有锁a,试图获取锁b");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (b) {
System.out.println(Thread.currentThread().getName()+" 获取锁b");
}
}
},"A").start();

new Thread(()->{
synchronized (b) {
System.out.println(Thread.currentThread().getName()+" 持有锁b,试图获取锁a");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (a) {
System.out.println(Thread.currentThread().getName()+" 获取锁a");
}
}
},"B").start();


}
}

死锁案例演示_死锁_02

4、验证是否是死锁

可以使用jps命令查看进程,再用jvm自带的堆栈跟踪工具jstack查看

死锁案例演示_juc_03


可以看到需要验证的进程id为10840

然后执行命令​​jstack 10840​

死锁案例演示_1024程序员节_04

可以看到 B持有锁b 试图获取锁a
A持有锁a,试图获取锁b