两个线程互相占有了对方想要的资源,而且在互相等待对方释放占有的资源,因此都处于阻塞态
线程A占有了资源2,并且想要资源资源1
线程B占有了资源1,并且想要资源2
代码实现

线程 A 先是获得锁1,然后让线程 A 休眠 1s,这是为了让线程A不要一下子两把锁都拿到,给时间让B线程去拿锁2( 线程B开始执行),线程B获得锁2
然后线程A想要获得被线程B占有的锁2,线程B想要获得被线程A占有的锁1
- Object obj1 = new Object();//资源 1
- Object obj2 = new Object();//资源 2
-
- Thread thread1=new Thread(() -> { synchronized (obj1) {
- System.out.println("Thread1 get obj1 lock");
- Thread.sleep(10);//这里暂停线程1是为了等待让线程2启动起来
- synchronized (obj2) {
- System.out.println("Thread1 is running");
- }
- }});
-
-
- Thread thread2= new Thread(() -> { synchronized (obj2) {
- System.out.println("Thread2 get obj2 lock");
- Thread.sleep(10);//这里暂停线程1是为了等待让线程2启动起来
- synchronized (obj1) {
- System.out.println("Thread2 is running");
- }
- }});
-
- thread1.start();
- thread2.start();
死锁的四个必要条件:
通过破坏循环等待条件破坏死锁:
两个线程申请锁的顺序本来是相反的,线程1先申请锁1,然后申请锁2,线程2先申请锁2,然后申请锁1
现在调整为两个线程申请锁的顺序相同,线程1先申请锁1,然后申请锁2,线程2也是先申请锁1,然后申请锁2
- public class DeadLockDemo
- {
- Object obj1 = new Object();//资源 1
- Object obj2 = new Object();//资源 2
-
- public static void main(String[] args)
- {
- new Thread(() -> { synchronized (obj1)
- {
- Thread.sleep(1000);
-
- synchronized (obj2)
- {
-
- }
- }, "线程 1").start();
-
- new Thread(() -> { synchronized (obj1)
- {
- Thread.sleep(1000);
-
- synchronized (obj2)
- {
-
- }
- }, "线程 2").start();
- }
- }
如何预防死锁?
形成死锁的四个条件除了第一个互斥条件不能破坏,其他三个条件都可以破坏:
如和避免死锁:银行家算法