package com.example.app;

public class DeadLockTest {
public static void main(String[] args) throws Exception {

Thread t1=new Thread(new Runnable() {
@Override
public void run() {
A.test();
}
},"Thread-A");

Thread t2=new Thread(new Runnable() {
@Override
public void run() {
B.test();
}
},"Thread-B");

t1.start();
t2.start();

t1.join();
t2.join();



}
}

class A{

public static synchronized void test(){
System.out.println("test function in class A......");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
B.test();
}

}

class B{
public static synchronized void test(){
System.out.println("test function in class B......");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
A.test();
}

}

分析:
Thread-A 持有类A的class对象的锁,等待类B的class对象的锁
Thread-B 持有类B的class对象的锁,等待类A的class对象的锁
形成死锁

Java: 写一个死锁的程序_死锁

Java: 写一个死锁的程序_死锁_02