gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 17:52:05 25 4
gpt4 key购买 nike

希望能回答一个简单的问题。我对此找不到任何绝对明确的答案。任何人都可以提供可靠的消息来源吗?

我的普遍看法是,在不使用适当的同步块(synchronized block)的情况下,延迟加载在多线程应用程序中是危险的。我想知道这是否适用于 Spring。

谢谢。

最佳答案

我不知道Spring在哪里声称可以安全发布由IoC容器管理的bean。

但是,快速浏览一下 bean 工厂/应用程序上下文代码会发现有很多关键位置受到同步保护(例如注册/取消注册 bean 定义、后处理阶段等)。看到DefaultSingletonBeanRegistry中的很多方法都有同步块(synchronized block)。

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

它使用双重检查锁定(org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton()),因此 bean 可以安全发布。

此外,关于线程安全,我记得 spring 之前在初始版本中存在错误,并且随着版本的改进而得到改进,请注意:

1.singleton beans(惰性和非惰性)始终被完全实例化(包括 init 方法)并安全发布。因此它们的构造是线程安全的 - 如果另一个线程确实看到这个 bean,它永远不会看到具有某些字段默认值的半初始化单例

2.prototype beans 构造不是线程安全的,但通常原型(prototype) beans 不会在线程之间共享,如果必须共享 - 您需要自己确保将它们安全地发布到其他线程此行为是框架有意为之的

关于java - Spring的@Lazy初始化是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48980650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com