死锁:指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。例如:假如有一个线程,在它执行的过程中。他首先需要锁定A,然后再需要锁定B,再锁定A的过程中还需要锁定B,另一个线程需要先锁定B,然后再需要锁定A,再锁定B的过程中还需要锁定A,整个线程才能完成。这时第一个线程把A锁拿了,第二个线程把B锁拿了,这时候第一个线程想去抢夺B锁,而此时第二个线程想去抢夺A锁,此时两个线程都执行不下去了就出现了死锁。
如下代码所示:
package chapter8;
/**
* @Author
* @Date 2019/7/23 20:24
**/
public class DeadLockTest01 {
private final static Object lock1 = new Object();
private final static Object lock2 = new Object();
private static void m1(){
synchronized (lock1){
m11();
}
}
private static void m11(){
synchronized (lock2){
System.out.println("调用m11");
}
}
private static void m2(){
synchronized (lock2){
m22();
}
}
private static void m22(){
synchronized (lock1){
System.out.println("调用m22");
}
}
public static void main(String[] args) {
new Thread(()->{
while (true)
m1();
}).start();
new Thread(()->{
while (true)
m2();
}).start();
}
}
结果:
此时虚拟机迟迟不会停止。
查看可知,此时Found 1 deadlock.