Spring单例bean是线程安全的吗?

我想知道Spring单例bean是否是线程安全的,如果是,那么为什么,如果没有那么为什么呢?

因为我是spring的初学者,所以帮助将不胜感激。

不,这两个概念甚至没有关系。

单身人士是关于创造的 。 此设计模式确保只创建一个类的一个实例。

线程安全就是执行 。 引用维基百科 :

如果一段代码仅以保证多个线程同时安全执行的方式操作共享数据结构,则它是线程安全的。

因此最终线程安全仅取决于代码和代码。 这就是为什么Spring bean本身不是线程安全的原因。

Spring单例bean只是因为Spring实例化它们而不是线程安全的。 抱歉。

Spring只管理单例bean的生命周期并维护对象的单个实例。 线程安全与它无关。

如果不是那么为什么?

因为单身和线程安全是两个不同的概念。 您可以使用synchronized关键字来获取线程安全性

我有不同的看法:一次创建Spring单例bean,任何时候都只能有一个实例可用。

假设您有一个在非同步方法中修改的实例变量。 在multithreading环境中,将为所有线程分配相同的类实例,并且2个并发线程可以更新/更改可能导致意外情况的实例变量。 单例bean不提供线程安全性,现在您知道实例变量的使用可能会导致意外结果,您有2个选项可以解决相同问题:

  1. 不要在multithreading环境中使用实例变量。 要么
  2. 在修改实例变量的任何位置使用synchronized块/关键字以避免意外结果。

如果不是那么为什么?

因为您可以在单例中引用非线程安全对象。

但是如果你不这样做,并且使用spring来注入任何实例变量,那么是的,它们是线程安全的。

Spring不保证线程安全。 这将是你的责任。 Spring将创建一个Singleton,但如果它是可变的,那么它可能不是线程安全的。 IT程序员有责任照顾spring bean类,这样它应该是线程安全的。

在Spring中,单例bean不会有任何状态(无状态)。 Singleton bean scope确保每个BeanFactory都有单个实例。 因此,在multithreading环境中,即使使用单例bean范围也不能保证单个实例。

因此,为了解决这个问题,我们需要将bean范围从单例范围更改为原型范围,因为开发人员有责任确保线程安全。