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,提问作者Роман Григорьев
相关产品推荐
相关产品推荐

