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

Mou*_*ddy 26 java spring spring-mvc

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

因为我是春天的初学者,所以请帮助.

a b*_*ver 31

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

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

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

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

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

  • 我意识到这是旧的,但由于这是我搜索 spring 线程安全的第一个谷歌结果之一,我想指出 Spring“单例 bean”与此答案所指的“单例”设计模式不同. . . “Spring singleton bean”实际上是指具有单例作用域的 Spring bean。 (2认同)
  • @ScottShipp 你认为它被命名为单例作用域是巧合吗?如果 bean 不存在,Spring 将创建该 bean,否则提供现有实例。这听起来很熟悉吗? (2认同)
  • 请参考[关于单例范围的Spring文档](http://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html#beans-factory-scopes-singleton):“ Spring 的单例 bean 概念与 Gang of Four (GoF) 模式书中定义的 Singleton 模式不同。GoF Singleton 对对象的范围进行硬编码,以便每个 ClassLoader 创建一个且仅一个特定类的实例. Spring 单例的范围最好按每个容器和每个 bean 来描述。” (2认同)

sun*_*waj 11

我有不同的看法:Spring 单例 bean 被创建一次,并且在任何时间点只能有一个实例可用。

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

  1. 不要在多线程环境中使用实例变量。或者
  2. 无论何时修改实例变量,都在方法上使用同步块/关键字以避免意外结果。


M S*_*ach 5

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

如果不是那么为什么?

因为单例和线程安全是两个不同的概念。您可以使用synchronized关键字来保证线程安全

  • 或者使 Spring Bean 无状态,我认为这是更好的方法。 (5认同)

小智 4

Spring 单例 bean 不是线程安全的,只是因为 Spring 实例化了它们。对不起。