TIP

这里提供一个synchronized实现简单死锁的Demo

方法m1执行时,锁定自己,调用方法m2

方法m2执行时,锁定自己,调用方法m1

互相等待

package com.mrzhang.javalearn.bingfa.demo_02;

/**
 * Synchronized基本使用(四)
 * <p>
 * 一个简单的死锁
 *
 * @author 91MrZhang on 2020/7/31
 */
public class SynchronizedDemo04 {

    private final Object lock1 = new Object();
    private final Object lock2 = new Object();

    public void m1() {
        synchronized (lock2) {
            System.out.println("m1准备工作");
            try {
                Thread.sleep(2000);
                m2();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("m1结束工作");
        }
    }

    public void m2() {
        synchronized (lock1) {
            System.out.println("m2准备工作");
            try {
                Thread.sleep(4000);
                m1();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("m2结束工作");
        }
    }

    public static void main(String[] args) {
        SynchronizedDemo04 sd04 = new SynchronizedDemo04();
        new Thread(sd04::m1, "线程1号").start();
        new Thread(sd04::m2, "线程2号").start();
    }
}