什么是死锁

死锁是两个及两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无力干涉,那他们将无法推进下去。如果系统资源充足,进程的资源请求都能得到满足,死锁出现的可能性就会比较低,否则就会因争夺有限的资源而陷入死锁。
image.png

死锁demo

  1. package com.interview.demo;
  2. import lombok.AllArgsConstructor;
  3. import java.util.concurrent.TimeUnit;
  4. /**
  5. * @Author leijs
  6. * @date 2022/3/29
  7. */
  8. public class DeadLockDemo {
  9. public static void main(String[] args) {
  10. String lockA = "lockA";
  11. String lockB = "lockB";
  12. new Thread(new HoldDeadLockThread(lockA, lockB), "AAAAA").start();
  13. new Thread(new HoldDeadLockThread(lockB, lockA), "BBBB").start();
  14. }
  15. }
  16. @AllArgsConstructor
  17. class HoldDeadLockThread implements Runnable {
  18. private String lockA;
  19. private String lockB;
  20. @Override
  21. public void run() {
  22. synchronized (lockA) {
  23. System.out.println(Thread.currentThread().getName() + "自己持有" + lockA + "尝试获取" + lockB);
  24. try {
  25. TimeUnit.SECONDS.sleep(2);
  26. } catch (InterruptedException e) {
  27. e.printStackTrace();
  28. }
  29. synchronized (lockB) {
  30. System.out.println(Thread.currentThread().getName() + "自己持有" + lockB + "尝试获取" + lockA);
  31. }
  32. }
  33. }
  34. }

怎么排查死锁?

image.png

jstack 进程编号:
image.png
image.png