死锁的产生与排查:从原理到实战
一、什么是死锁? 1.1 死锁示例 public class DeadlockDemo { private static Object lock1 = new Object(); private static Object lock2 = new Object(); public static void main(String[] args) { // 线程1:先锁lock1,再锁lock2 Thread t1 = new Thread(() -> { synchronized (lock1) { System.out.println("线程1:持有lock1,等待lock2"); sleep(100); // 模拟业务逻辑 synchronized (lock2) { System.out.println("线程1:获取lock2成功"); } } }); // 线程2:先锁lock2,再锁lock1 Thread t2 = new Thread(() -> { synchronized (lock2) { System.out.println("线程2:持有lock2,等待lock1"); sleep(100); synchronized (lock1) { System.out.println("线程2:获取lock1成功"); } } }); t1.start(); t2.start(); // 输出: // 线程1:持有lock1,等待lock2 // 线程2:持有lock2,等待lock1 // ... 程序卡住,发生死锁! } private static void sleep(long millis) { try { Thread.sleep(millis); } catch (InterruptedException e) { e.printStackTrace(); } } } 死锁定义: 两个或多个线程互相持有对方需要的资源,导致所有线程都无法继续执行。 ...