死锁是一种特定的程序状态。由于循环依赖导致彼此一直处于等待之中,没有任何线程可以继续前进。死锁大多是指两个或多个线程之间,由于互相持有对方需要的锁,而永久处于阻塞的状态。
简单来说,假设有2个线程,一共有2把锁 , 线程1想获取锁1后重复获取锁2,线程2想获取锁2后重复获取锁1, 这个时候就有可能发生死锁。
如下图所示:
以下代码演示一个死锁:
public class Demo9 {
public static void main(String[] args) {
Object lock1=new Object();
Object lock2=new Object();
//线程A
Thread tA=new Thread(()->{
//获取到lock1
synchronized (lock1){
System.out.println("A获取到lock1");
//尝试获取lock2
synchronized (lock2){
System.out.println("");
}
}
},"A");
//线程B
Thread tB=new Thread(()->{
//获取到lock2
synchronized (lock2){
System.out.println("B线程获取到lock2");
//尝试获取lock1
synchronized (lock1){
System.out.println("");
}
}
},"B");
tA.start();
tB.start();
}
}
打开jdk的目录,在\bin
目录下有一个jvisualvm.exe
,双击打开。这是一个可视化工具,可以方便的观察线程的情况。
运行以上代码后,然后在jvisualvm.exe
下可以看到