什么是死锁、简单定位死锁

什么是死锁、简单定位死锁

什么是死锁?

死锁(Deadlock)是多线程编程中的经典问题,指在多进程或多线程环境下,两个或多个进程(线程)因争夺系统资源或彼此通信而处于一种相互等待的状态,若无外力作用,它们都将无法推进下去,就好像这些进程(线程)“卡死” 了一样。例如,进程 A 占用了资源 1 并等待资源 2,而进程 B 占用了资源 2 并等待资源 1,此时 A 和 B 都在等待对方释放自己所需的资源,从而陷入无限期的等待,这就是一种典型的死锁情况

当满足以下四个必要条件时就会发生死锁:

  1. 互斥条件 - 资源每次只能被一个线程使用
  2. 请求与保持条件 - 线程持有资源的同时请求新资源
  3. 不可剥夺条件 - 已分配的资源不能被强制剥夺
  4. 循环等待条件 - 线程间形成头尾相接的等待关系

这里举一个简单例子

两个线程分别需要同时获取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();

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值