You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring中DefaultSingletonBeanRegistry的singletonFactories线程安全及可见性咨询

关于Spring DefaultSingletonBeanRegistry中singletonFactories的线程安全与可见性问题

问题1:为何使用HashMap而非ConcurrentHashMap?是否线程安全?

  • 选择HashMap的核心原因是所有对singletonFactories的读写操作都被严格限制在以singletonObjects为锁的同步块内,不存在多线程并发读写的场景,因此不需要ConcurrentHashMap自带的线程安全机制,用普通HashMap能减少不必要的性能开销。
  • 它是线程安全的。Spring的代码确保了同一时间只有一个线程能进入操作singletonFactories的同步块,彻底避免了HashMap在并发场景下可能出现的扩容死循环、数据丢失等问题。

问题2:singletonFactories的变更是否对其他线程可见?线程2能否看到线程1添加的新值?

  • 所有变更都是可见的,线程2能看到线程1此前添加的新值。
  • 依据Java内存模型的happens-before规则:当线程退出以singletonObjects为锁的同步块时,会将该线程内所有变量的修改(包括singletonFactories内部Map的结构变更)刷新到主内存;当其他线程进入同一个锁的同步块时,会强制从主内存读取所有变量的最新值。
  • 虽然singletonFactories内部的数组不是volatile,但同步块的内存屏障效果已经覆盖了这个场景,确保了所有线程看到的singletonFactories状态都是一致的。

内容的提问来源于stack exchange,提问作者Роман Григорьев

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 04:06:12