什么是死锁、简单定位死锁
什么是死锁?
死锁(Deadlock)是多线程编程中的经典问题,指在多进程或多线程环境下,两个或多个进程(线程)因争夺系统资源或彼此通信而处于一种相互等待的状态,若无外力作用,它们都将无法推进下去,就好像这些进程(线程)“卡死” 了一样。例如,进程 A 占用了资源 1 并等待资源 2,而进程 B 占用了资源 2 并等待资源 1,此时 A 和 B 都在等待对方释放自己所需的资源,从而陷入无限期的等待,这就是一种典型的死锁情况
当满足以下四个必要条件时就会发生死锁:
- 互斥条件 - 资源每次只能被一个线程使用
- 请求与保持条件 - 线程持有资源的同时请求新资源
- 不可剥夺条件 - 已分配的资源不能被强制剥夺
- 循环等待条件 - 线程间形成头尾相接的等待关系
这里举一个简单例子:
两个线程分别需要同时获取A、B两个锁才能完成任务,但是线程1先获取了A锁,而线程2获取了B锁,导致谁也无法完成任务,都在互相等待对方释放另一把锁:
/**
* 死锁示例
*/
public class DeadLock {
private static final Object lockA = new Object();
private static final Object lockB = new Object();
public static void main(String[] args) {
// 线程1
Thread t1 = new Thread(() -> {
// 获取锁A
synchronized (lockA){
System.out.println("[线程t1]------------" + "获取锁A");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 获取锁B
synchronized (lockB){
System.out.println("[线程t1]------------" + "获取锁B");
}
}
}, "t1");
// 线程2
Thread t2 = new Thread(() -> {
// 获取锁B
synchronized (lockB){
System.out.println("[线程t2]------------" + "获取锁B");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 获取锁A
synchronized (lockA){
System.out.println("[线程t2]------------" + "获取锁A");
}
}
}, "t2");
t1.start();
t2.start();
}
}

最低0.47元/天 解锁文章
636

被折叠的 条评论
为什么被折叠?



