`
san_yun
  • 浏览: 2663761 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

dubbo导致死锁问题

 
阅读更多

延迟暴露

(+ ) (# )

如果你的服务需要Warmup时间,比如初始化缓存,等待相关资源就位等,可以使用delay进行延迟暴露。

延迟5秒暴露服务:

< dubbo:service delay = "5000" />

延迟到Spring初始化完成后,再暴露服务:(基于Spring的ContextRefreshedEvent事件触发暴露)

< dubbo:service delay = "-1" />
Spring2.x初始化死锁问题
在Spring解析到<dubbo:service />时,就已经向外暴露了服务,而Spring还在接着初始化其它Bean。
如果这时有请求进来,并且服务的实现类里有调用applicationContext.getBean()的用法。

1. 请求线程的applicationContext.getBean()调用,先同步singletonObjects判断Bean是否存在,不存在就同步 beanDefinitionMap进行初始化,并再次同步singletonObjects写入Bean实例缓存。

2. 而Spring初始化线程,因不需要判断Bean的存在,直接同步beanDefinitionMap进行初始化,并同步singletonObjects写入Bean实例缓存。

这样就导致getBean线程,先锁singletonObjects,再锁beanDefinitionMap,再次锁singletonObjects。
而Spring初始化线程,先锁beanDefinitionMap,再锁singletonObjects。
反向锁导致线程死锁,不能提供服务,启动不了。

规避办法
1. 强烈建议不要在服务的实现类中有applicationContext.getBean()的调用,全部采用IoC注入的方式使用Spring的Bean。
2. 如果实在要调getBean(),可以将Dubbo的配置放在Spring的最后加载。
3. 如果不想依赖配置顺序,可以使用<dubbo:provider deplay=”-1” />,使Dubbo在Spring容器初始化完后,再暴露服务。
4. 如果大量使用getBean(),相当于已经把Spring退化为工厂模式在用,可以将Dubbo的服务隔离单独的Spring容器。
分享到:
评论
1 楼 yangpeihai 2016-07-22  

相关推荐

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    180多页面试题,前前后后不间断的更新了...【Dubbo】dubbo使用中遇到的问题 174 【Zookeeper】zookeeper介绍 178 1、简介 178 2、基本概念 179 3. ZooKeeper典型应用场景 183 4、ZooKeeper在大型分布式系统中的应用 189

    面试总结2019年9月3日.doc

    20. **线程死锁示例**:两个线程互相等待对方释放资源,导致无法继续执行。 21. **HTTP报文结构**:包含请求行、请求头、空行、请求体,以及响应行、响应头、空行、响应体。 22. **Vector和ArrayList的区别**:...

    互联网高频Java后端面试题20道(适合1~3年)V1.0.78.docx

    解析:并发编程用于提高多核或多处理器环境下的程序性能,合理使用并发控制工具可以有效地管理线程的同步和通信,避免死锁和数据竞争等问题。 问题 13:谈谈 Spring Cloud 和Dubbo的区别,它们分别适用于哪些场景?...

    【java系列文章】java 基础知识

    - 同步代码块:使用`synchronized`关键字包裹部分代码,可自定义锁对象,粒度更细,提高了并发效率,但可能导致死锁或同步范围不当的问题。 6. HashMap与Hashtable的区别: - HashMap允许空键值对,而Hashtable不...

    分布式锁简单实现

    - **基于分布式服务框架的锁**:如Dubbo、Spring Cloud等提供的分布式锁服务。 3. **锁的特性**: - **公平性**:按照请求顺序分配锁,避免饥饿现象。 - **非阻塞**:当无法获取锁时,立即返回失败,而不是等待...

    支付场景微服务实战

    - 数据库设计不合理,如频繁出现的死锁、事务处理不当等问题。 - 缺乏足够的容错机制,对异常情况处理不足。 - 过度的日志记录影响性能。 - 缓存使用不当,如缓存穿透、雪崩效应等问题。 - **架构层面**: - ...

    并发编程1

    然而,随着并发程度的增加,会出现一系列问题,如线程安全问题(死锁、活锁、饥饿)、竞态条件、数据一致性等,这些问题需要开发者深入理解并发原理,并熟练掌握并发控制机制(如`synchronized`、`volatile`、`Lock`...

    分布式锁原理讲解视频资料

    5. 防止重复操作:比如订单创建,分布式锁可以防止因网络延迟导致的重复下单问题。 视频“David_6_13_分布式锁的前世今生.mp4”将详细讲解以上内容,并可能进一步探讨各种实现方式的优缺点,以及在实际项目中如何...

    20-BAT面试题汇总及详解(进大厂必看).docx

    死锁是多个线程互相等待对方释放资源导致的僵局,可以通过避免循环等待条件来预防。 二、JVM内存模型与垃圾收集 Java虚拟机(JVM)内存模型包括堆、栈、方法区、本地方法栈和程序计数器。GC(Garbage Collection)...

    java面试题(java基础、web、数据库等)

    6. 数据库事务:理解ACID属性(原子性、一致性、隔离性、持久性),掌握事务的四种隔离级别(读未提交、读已提交、可重复读、串行化)及其可能导致的问题。 7. 索引:索引的类型(B树、哈希索引)、创建和使用,...

    Java聊天程序代码

    通过多线程,可以确保用户界面的流畅性,避免因为网络延迟而导致的卡顿现象。 二、Socket编程 Java中的Socket类是网络通信的基础,用于建立客户端与服务器之间的连接。在聊天程序中,服务器端会创建一个...

    LCN4.0使用说明PPT

    4. **补偿机制**:事务补偿用于处理那些由于异常(如服务器故障或网络问题)而未能成功提交的事务。LCN通过以下方式实现补偿: - **触发条件**:当事务发起方收到失败状态时,会将其识别为待补偿事务,并通知...

    (2024)跳槽涨薪必备精选面试题.pdf

    - 非公平锁可能会导致饥饿现象,但在实际应用中通常具有更高的吞吐量。 4. **ReentrantLock中tryLock()和lock()方法的区别** - `tryLock()` 尝试获取锁,可设置等待时间,不会阻塞线程。 - `lock()` 必须获取到...

    java面试题_多线程(68题)

    9. **死锁**:两个或更多线程相互等待对方释放资源,导致无法继续执行的状态。如何预防和解决死锁? 10. **线程池**:`ExecutorService`接口和`ThreadPoolExecutor`类提供了线程池的实现,能有效管理线程,提高系统...

    百度面经1

    30. **CAS(Compare and Swap)**:无锁编程的一种原子操作,但可能导致ABA问题。 31. **Synchronized**:Java内置的同步机制,保证同一时刻只有一个线程访问临界区。 32. **HTTPS与SSL**:HTTPS基于SSL/TLS协议,...

    java程序员面试大纲错过了金三银四你还要错过2018吗.docx

    4. **TCP粘包/拆包**:由于TCP协议的流式传输特性,可能导致数据包边界模糊不清,通过设置合理的发送间隔或使用特殊分隔符等方法可以有效避免该问题。 5. **序列化协议**:如JSON、Protobuf、Thrift等,选择合适的...

    阿里巴巴Java开发手册终极版v1.3.0

    3. 微服务架构:提倡模块化、服务化,通过API Gateway实现服务间通信,利用Dubbo或Spring Cloud构建微服务。 五、性能优化 1. 数据库优化:合理设计数据库表结构,避免全表扫描,使用索引提高查询效率。 2. 缓存...

    java超有用的面试题目

    - 在并发环境下,`HashMap`可能会出现死锁等问题,主要是因为其内部操作是非线程安全的。 - 解决方案通常包括使用`ConcurrentHashMap`或者对`HashMap`进行外部同步控制。 #### LinkedHashMap的应用 - `...

Global site tag (gtag.js) - Google Analytics