His*_*His 0 java spring thread-safety lazy-initialization
希望一个简单的问题来回答。我找不到任何绝对明确的答案。任何人都可以帮助提供可靠的消息来源。
我的普遍看法是,如果不使用适当的同步块,延迟加载在多线程应用程序中是危险的。我想知道这是否适用于 Spring。
谢谢。
我不知道任何地方 Spring 声称由 IoC 容器管理的 bean 的安全发布。
然而,快速浏览 bean 工厂/应用程序上下文代码会发现有很多由同步保护的关键位置(例如注册/注销 bean 定义、后处理阶段等)。看到 DefaultSingletonBeanRegistry 中的许多方法都有同步块。
关于延迟初始化 bean - 我看到在 DefaultSingletonBeanRegistry 内部,构造由围绕 singletonObjects 实例变量的锁保护。另外,singletonObjects 本身就是一个并发散列映射。
它使用双重检查锁定(org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton()),因此bean被安全发布。
除了线程安全之外,我记得 spring 在最初的版本中存在错误,并且随着版本进行了改进,并注意:
1.singleton bean(懒惰和非懒惰)总是完全实例化(包括 init 方法)并安全发布。因此它们的构造是线程安全的——如果另一个线程确实看到了这个 bean,它永远不会看到一个半初始化的单例,其中某些字段具有默认值
2.prototype beans 的构造不是线程安全的,但通常原型 bean 不在线程之间共享,如果必须这样做 - 您需要自己确保将它们安全地发布到其他线程,此行为是框架所预期的
归档时间: |
|
查看次数: |
978 次 |
最近记录: |