记录一次死锁检测

  1. 现象是这样的,服务有时启动正常,有时启动失败,最后排查发现是mq消费者造成的。 启动dubbo过程中,mq消费者正常消费,调用某个dubbo服务。此时dubbo application正处于starting状态,造成了死锁。

2.模拟死锁过程,获取到的线程信息,已省略无关的信息。

java 复制代码
Found one Java-level deadlock:
=============================
"Thread-2":
  waiting to lock monitor 0x00000136bfd3bb88 (object 0x00000005c4c594f0, a org.apache.dubbo.config.deploy.DefaultModuleDeployer),
  which is held by "main"
"main":
  waiting to lock monitor 0x00000136ba6465d8 (object 0x00000005c46287e0, a java.util.concurrent.ConcurrentHashMap),
  which is held by "Thread-2"

Java stack information for the threads listed above:
===================================================
"Thread-2":
        at org.apache.dubbo.config.deploy.DefaultModuleDeployer.startSync(DefaultModuleDeployer.java:143)
        - waiting to lock <0x00000005c4c594f0> (a org.apache.dubbo.config.deploy.DefaultModuleDeployer)
        at org.apache.dubbo.config.deploy.DefaultModuleDeployer.start(DefaultModuleDeployer.java:139)
        at org.apache.dubbo.config.ReferenceConfig.get(ReferenceConfig.java:228)
        at org.apache.dubbo.config.spring.ReferenceBean.getCallProxy(ReferenceBean.java:351)
        - locked <0x00000005c46287e0> (a java.util.concurrent.ConcurrentHashMap)
        at org.apache.dubbo.config.spring.ReferenceBean.access$100(ReferenceBean.java:100)
        at org.apache.dubbo.config.spring.ReferenceBean$DubboReferenceLazyInitTargetSource.createObject(ReferenceBean.java:359)
        at org.springframework.aop.target.AbstractLazyCreationTargetSource.getTarget(AbstractLazyCreationTargetSource.java:86)
        - locked <0x00000005c98d68d0> (a org.apache.dubbo.config.spring.ReferenceBean$DubboReferenceLazyInitTargetSource)
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:192)
        ....
"main":
        at org.springframework.context.event.AbstractApplicationEventMulticaster.getApplicationListeners(AbstractApplicationEventMulticaster.java:187)
        - waiting to lock <0x00000005c46287e0> (a java.util.concurrent.ConcurrentHashMap)
        at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:128)
        at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:393)
        at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:347)
        at org.apache.dubbo.config.spring.ServiceBean.publishExportEvent(ServiceBean.java:133)
        at org.apache.dubbo.config.spring.ServiceBean.exported(ServiceBean.java:125)
        at org.apache.dubbo.config.ServiceConfig.doExport(ServiceConfig.java:392)
        - locked <0x00000005c9398570> (a org.apache.dubbo.config.spring.ServiceBean)
        at org.apache.dubbo.config.ServiceConfig.export(ServiceConfig.java:243)
        - locked <0x00000005c9398570> (a org.apache.dubbo.config.spring.ServiceBean)
        at org.apache.dubbo.config.deploy.DefaultModuleDeployer.exportServiceInternal(DefaultModuleDeployer.java:350)
        at org.apache.dubbo.config.deploy.DefaultModuleDeployer.exportServices(DefaultModuleDeployer.java:322)
        at org.apache.dubbo.config.deploy.DefaultModuleDeployer.startSync(DefaultModuleDeployer.java:158)
        - locked <0x00000005c4c594f0> (a org.apache.dubbo.config.deploy.DefaultModuleDeployer)
        at org.apache.dubbo.config.deploy.DefaultModuleDeployer.start(DefaultModuleDeployer.java:139)
        at org.apache.dubbo.config.spring.context.DubboDeployApplicationListener.onContextRefreshedEvent(DubboDeployApplicationListener.java:113)
        at org.apache.dubbo.config.spring.context.DubboDeployApplicationListener.onApplicationEvent(DubboDeployApplicationListener.java:102)
        at org.apache.dubbo.config.spring.context.DubboDeployApplicationListener.onApplicationEvent(DubboDeployApplicationListener.java:47)
		...

Found 1 deadlock.
  1. 解决方案
java 复制代码
    @EventListener
    public void onDubboStarted(DubboApplicationStateEvent event) {
        if (event.getState() == DeployState.STARTED) {
            doSomething();
        }
    }
相关推荐
独泪了无痕16 小时前
探索Pinyin4j-Java中的拼音转换利器
java·后端
道尔柯南17 小时前
C++ string 类详解:从常用接口到深拷贝,彻底掌握字符串处理
android·java·c++
kingx318 小时前
Bugku 3122 谷歌小恐龙题解:纯离线逆向 Vault 的 AES-GCM 加密资源(附 Python 解密器)
java·逆向·ctf·bugku·aes-gcm
DevOpenClub20 小时前
职教高考控制线 API:招生类别枚举、筛选与空分数含义
java·数据库·高考
露天赏雪21 小时前
第3篇:Sentinel熔断降级实战:大模型接口抖动时的服务兜底方案
java·开发语言·人工智能·spring boot·spring·servlet·sentinel
天天被压力21 小时前
【A股分钟级高频数据完全手册 #06】北交所分钟级数据接口:京市股票Pro版最新分时
java·人工智能·python
天天被压力21 小时前
【A股分钟级高频数据完全手册 #05】指数历史分钟数据接口:Pro版沪深指数分时回放
java·人工智能·python
captain37621 小时前
▲统一功能——DispatcherServlet源码分析
java·spring·java-ee·log4j·maven
金銀銅鐵21 小时前
JDK 21 中 List.of 的实现细节:从 List12 到 ListN
java·后端·ai编程
yeccheng1 天前
MySQL 索引超详解:从底层 B+ 树到面试高频考点
java·开发语言·jvm·mysql·面试