Java Spring单例bean线程安全吗?

Java Spring单例bean线程安全吗?,java,spring,spring-mvc,Java,Spring,Spring Mvc,我想知道Spring单例bean是否是线程安全的,如果是,那么为什么,如果不是,那么为什么 因为我是spring的初学者,所以非常感谢您的帮助。spring单例bean不是线程安全的,因为spring实例化了它们。抱歉。Spring只是管理singleton bean的生命周期并维护对象的单个实例。线程安全与此无关 若否,原因为何 因为单例和线程安全是两个不同的概念。您可以使用synchronized关键字实现线程安全 若否,原因为何 因为您可以在singleton中引用非线程安全对象 但是如果

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


因为我是spring的初学者,所以非常感谢您的帮助。

spring单例bean不是线程安全的,因为spring实例化了它们。抱歉。

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

若否,原因为何

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

若否,原因为何

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


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

否。这两个概念甚至不相关

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

线程安全是关于执行的。引述:

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


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

Spring不能保证线程安全。这将是你的责任。Spring将创建一个单例,但如果它是可变的,那么它可能不是线程安全的。程序员有责任以线程安全的方式维护Springbean类。

在spring中,单例bean将没有任何状态(无状态)。SingletonBean范围确保每个BeanFactory有一个实例。因此,在多线程环境中,即使使用SingletonBean范围,也无法保证单个实例


因此,为了解决这个问题,我们需要将bean范围从singleton范围更改为prototype范围,因为确保线程安全是开发人员的责任

我有不同的看法: SpringSingletonbean只创建一次,并且在任何时候都只能有一个实例可用

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

  • 不要在多线程环境中使用实例变量。 或
  • 在修改实例变量的任何位置对方法使用同步块/关键字,以避免意外结果

  • 单例bean是否线程安全取决于作用域为单例的类是如何编写的。每个调用线程都有自己的执行,并且不会干扰另一个线程的执行,除非所有调用线程共享的单例作用域类中有一些代码。例如,如果一个类具有全局声明的变量,并且该变量正被其方法访问,并且这些值被修改,那么这可能会导致并发问题因此,最好将这些变量放在方法级别,而不是类级别。

    不,Spring singelton bean不是线程安全的,下面是一个示例

    public class Emmloyee {
    
    private int id;
    
    private String name;
    
    public int getId() {
        return id;
    }
    
    public void setId(int id) {
        this.id = id;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    
    }
    
    下面是
    applicationContext.xml

      <bean id="emp" class="com.manikant.Emmloyee" p:id="26"  p:name="Manikant Gautam">
    
    这是输出

          User Manikant Gautam is of age 26
    
          User Changed name is of age 26
    

    emp.setName(“更改值”)对
    值的更改也反映了不同的
    bean emp1

    根据我的观点,单例类的线程安全完全取决于单例类的设计/编写

    如果在singleton类中定义了任何全局变量,那么它将不是线程安全的,因为如果多个线程共享singleton对象并执行可以更新全局变量的方法,那么它将不是线程安全的


    要使任何单例类线程安全,建议将该类设为无状态意味着您应该避免在单例类中定义全局变量。

    上游使用并行处理调用了我的服务,它使我的应用程序崩溃。当线程1处理beanA时,另一个请求到达,它设置了beanA的一些参数。当我的beanA存储在数据库中时,我验证了它是一团乱麻。我用原型修复了它。

    Spring不能保证线程安全。这将是你的责任。Spring将创建一个单例,但如果它是可变的,那么它可能不是线程安全的。线程安全与单例无关。纯单例或Spring不重要。保证在多线程环境中只创建一个实例不是线程安全吗?@AndreiPodoprîgora当然不是——这取决于bean的实际功能。@DaveNewton——如果开发人员不关心线程安全,不以正确的方式编写单例,那么会创建许多实例-所以单例不是线程安全的。或者通过使Springbean成为无状态的,我认为这是更好的方法。或者使所有共享实例变量成为方法局部变量(将变量从堆移动到堆栈)我意识到这很古老,但因为这是我在搜索spring线程安全性时看到的第一个Google结果之一,我想指出spring的“单例bean”不同于这个答案所指的“单例”设计模式。“SpringSingletonBean”实际上是指具有singleton作用域的SpringBean。@Scottship,您认为它被命名为singleton作用域是巧合吗?如果bean不存在,Spring将创建它,否则将提供现有实例。这听起来熟悉吗?请参考:“Spring的单例bean概念不同于GangofFour(GoF)模式boo中定义的单例模式
          User Manikant Gautam is of age 26
    
          User Changed name is of age 26