什么是死锁:
- 死锁的定义:死锁是指两个或两个以上的进程(线程)在运行过程中因争夺资源而造成的一种僵局(Deadly-Embrace),若无外力作用,这些进程(线程)都将无法向前推进。
死锁的几个结论:
- 参与的进程数至少有2个
- 参与死锁所有进程均等待资源
- 参与死锁的进程至少有2个已经占有资源
- 死锁进程是当前系统中进程集合的一个子集
- 死锁会造成浪费大量的系统资源,甚至导致系统崩溃
实不相瞒,我开始在main()方法里调用getLock1
与getLock2
,我还纳闷这俩方法兄弟咋不抢呢
方法:"都在主线程还整死锁呢"
其实说白了就是线程产生了竞态,线程同时持有与等待 我们创造这种条件即可
在程序中,我们让thread-1持有lock1,请求lock2
让thread-2持有lock2,请求lock1 即符合了同时持有和等待
public class ZDeadLock {
private static final Object lock1 = new Object();
private static final Object lock2 = new Object();
public static void main(String[] args) {
new Thread(
new Runnable() {
@Override
public void run() {
getLock1();
}
})
.start();
new Thread(
new Runnable() {
@Override
public void run() {
getLock2();
}
})
.start();
}
public static void getLock2() {
synchronized (lock1) {
System.out.println("持有lock1,等待获取lock2..");
synchronized (lock2) {
System.out.println("获取到了lock2");
}
}
}
public static void getLock1() {
synchronized (lock2) {
System.out.println("持有lock2,等待获取lock1..");
synchronized (lock1) {
System.out.println("获取到了lock1");
}
}
}
}
运行后果然是漫长的无限等待,再也获取不到了
此时打开jvisualvm,闪动并提示我们出现了死锁
此时线程dump会打印死锁的信息
了解了这些,下次程序中再出现死锁做到了知其所以然