Spring 的@Lazy 初始化线程安全吗?

Is Spring's @Lazy initialization thread-safe?

希望能回答一个简单的问题。我找不到任何绝对明确的答案。谁能帮忙提供可靠的消息来源。

我的看法是,如果不使用适当的同步块,延迟加载在多线程应用程序中是危险的。我想知道这是否适用于 Spring。

谢谢。

我不知道有什么地方 Spring 声称可以安全发布由 IoC 容器管理的 bean。

但是,快速浏览一下 bean factory/application 上下文代码会发现有很多关键位置由同步保护(例如 registering/unregistering bean 定义、post-processing 阶段等)。看到 DefaultSingletonBeanRegistry 中的很多方法都有同步块。

关于延迟初始化的 bean - 我看到在 DefaultSingletonBeanRegistry 内部,构造由围绕 singletonObjects 实例变量的锁保护。另外,singletonObjects本身就是一个并发的hash map。

它使用 double-checked 锁定 (org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton()),因此 bean 已安全发布。

除了线程安全,我记得 spring 之前在初始版本中有错误,并且随着版本的改进而改进, 并注意:

1.singleton beans(懒惰和 non-lazy)总是完全实例化(包括 init 方法)并安全发布。因此它们的构造是 thread-safe - 如果另一个线程确实看到这个 bean,它永远不会看到 half-initialized 某些字段具有默认值的单例

2.prototype beans 构造不是 thread-safe,但通常原型 beans 不在线程之间共享,如果它们必须共享 - 你自己确保将它们发布到其他安全线程 此行为是框架设计的