记一次多线程下CountDownLatch&dubbo 引发的服务假死问题

本文深入探讨了在多线程环境下使用CountDownLatch时可能遇到的死锁问题,特别是在Dubbo服务中,详细分析了问题产生的原因及解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记一次多线程下CountDownLatch 引发的死锁问题

这阵子开发环境一个dubbo服务发生一个假死现象:

  dubbo服务正常,日志持续打印pong日志,但是所有请求都返回超时或者通道关闭。
  如下:
  1、Caused by: org.apache.dubbo.remoting.TimeoutException: Waiting server-side response timeout by scan timer
  2、Caused by: org.apache.dubbo.remoting.RemotingException: message can not send, because channel is closed

排查最后发现问题片段类似下面,在CountDownLatch内再开多个子线程,子线程内再使用countDownLatch,导致问题出现

猜测是因为死锁导致dubbo的线程耗尽,但是并发请求几个也会出现这个问题,匪夷所思。

还有一个就是countDownLatch,我一直以为以这个对象为锁,我在每个Thread内都有新建一个countDownLatch对象,那正常逻辑来说也是不会出现死锁状况的。

demo简单,就是这么个场景,有大佬知道什么原因的吗?

样例代码:

public class Test {

    public static void main(String[] args) throws InterruptedException {
        CountDownLatch count = new CountDownLatch(2);
        // 第一个线程
        new Thread(()->{
            childThread();
            count.countDown();
        }).start();
        // 第二个线程
        new Thread(()->{
            childThread();
            count.countDown();
        }).start();
        // 等待两个任务完结
        count.await();
        System.out.println("结束!");
    }

    /**
     * 子任务
     */
    private static void childThread() {
        try{
            CountDownLatch count = new CountDownLatch(3);
            // 第一个线程
            new Thread(()->{
                System.out.println("最小的任务");
                count.countDown();
            }).start();
            // 第二个线程
            new Thread(()->{
                System.out.println("最小的任务");
                count.countDown();
            }).start();
            // 第三个线程
            new Thread(()->{
                System.out.println("最小的任务");
                count.countDown();
            }).start();
            // 等待两个任务完结
            count.await();
            System.out.println("子任务结束!");
        }catch (Exception e){
            e.printStackTrace();
        }
        
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热一杯饼干

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值