-
多个线程各自占有一些共享资源,并且互相等待其他线程占有的资源才能运行,而导致两个或者多个线程都在等待对方释放资源,都停止执行的情形.某一个同步块同时拥有“两个以上对象的锁”时,就可能会发生“死锁”的问题。
public class DeadlockExample { private static final Object lock1 = new Object(); private static final Object lock2 = new Object(); public static void main(String[] args) { Thread thread1 = new Thread(() -> { synchronized (lock1) { System.out.println("线程1持有lock1"); try { Thread.sleep(100); // 确保两个线程都能获取到第一个锁 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程1等待lock2..."); synchronized (lock2) { System.out.println("线程1持有lock1和lock2"); } } }); Thread thread2 = new Thread(() -> { synchronized (lock2) { System.out.println("线程2持有lock2"); System.out.println("线程2等待lock1..."); synchronized (lock1) { System.out.println("线程2持有lock2和lock1"); } } }); thread1.start(); thread2.start(); } }
-
产生死锁的四个必要条件:
-
互斥条件:一个资源每次只能被一个进程使用。
-
请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
-
不剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺。
-
循环等待条件:若干进程之间]形成一种头尾相接的循环等待资源关系。
-
四种产生条件我们只需要破解出一个或多个条件就可以避免死锁的发生