版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014745069/article/details/82079454
概述
死锁状态的大体思路是:Thread_1在获得A对象的锁后,紧接着去请求B对象的锁 ,Thread_2在获得了B对象的锁后,紧接着又去请求A对象的锁,如下图:
代码描述
public class DeadLockDemo {
static class A {
public synchronized void saying() {
System.out.println(Thread.currentThread().getName() + " A start...........");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
new B().saying();
System.out.println(Thread.currentThread().getName() + " A end.............");
}
}
static class B {
public synchronized void saying() {
System.out.println(Thread.currentThread().getName() + " B start...........");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
new A().saying();
System.out.println(Thread.currentThread().getName() + " B end.............");
}
}
public static void main(String[] args) {
new Thread(() -> new A().saying(), "t1").start();
new Thread(() -> new B().saying(), "t2").start();
}
}
可以看到在线程 t1 调用A对象的saying互斥方法的时候,t1拿到了A对象的锁,而如果想完成saying方法必须去请求B对象的锁才可以执行到B对象的saying互斥方法。线程 t2调用B对象的saying互斥方法的时候,t2拿到了B对象的锁,而如果想完成saying方法必须去请求A对象的锁才可以执行到A对象的saying互斥方法。
这就导致了死锁的出现,程序会陷入无休止的“死循环”中。
如果没有2秒的睡眠时间,程序会很快因内存溢出而瘫痪:
否则程序会不停的循环下去,直到崩溃。