死锁代码,启动程序
@SpringBootTest
class DemoApplicationTests {
/**
* 死锁示例
*/
//创建两个静态对象
private static Object A=new Object();
private static Object B=new Object();
public static void main(String[] args) {
//线程t1中
new Thread(()->{
//抢占资源A对象
synchronized (A){
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("执行线程t1,并在A中调用B");
//此处需要获取B对象,但是t2独占锁(未释放)--->相互竞争资源--->死锁
synchronized (B){
System.out.println("线程t1中,A中调用B");
}
}
},"t1").start();
//线程2中
new Thread(()->{
//抢占资源B对象
synchronized (B){
System.out.println("执行线程t2,并在B中调用A");
//此处需要获取A对象,但是t1独占锁(未释放)--->相互竞争资源--->死锁
synchronized (A){
System.out.println("线程t2中,B中调用A");
}
}
},"t2").start();
}
}
jps 查看线程id
jstack 线程id 查看死锁情况