Java singleton是有状态的吗?

Java singleton是有状态的吗?,java,spring,design-patterns,singleton,Java,Spring,Design Patterns,Singleton,嗨,我在一份面试答卷上被问到了这个问题 有状态和无状态的单例和原型(非单例) 我不确定原型是否是无状态的?这个问题有什么问题吗 问题本身措词不当。在单例和原型(实例)中都可以有状态,就像在法律代码中一样,但在这两种情况下都不需要有状态。既然提到了Spring,我将尝试回答关于Spring的问题 就SpringBean范围而言,singleton将导致ApplicationContext创建一个实例,并在要求bean的任何地方使用该实例prototype将使ApplicationContext在每

嗨,我在一份面试答卷上被问到了这个问题

有状态和无状态的单例和原型(非单例)


我不确定原型是否是无状态的?这个问题有什么问题吗

问题本身措词不当。在单例和原型(实例)中都可以有状态,就像在法律代码中一样,但在这两种情况下都不需要有状态。既然提到了Spring,我将尝试回答关于Spring的问题

就SpringBean范围而言,
singleton
将导致
ApplicationContext
创建一个实例,并在要求bean的任何地方使用该实例
prototype
将使
ApplicationContext
在每次请求bean时创建一个新实例


这两个都是有状态的是可以的。

更好的问题可能是“单例线程安全吗?”


如果它包含的状态是只读且不可变的,那么它是完全线程安全的。如果它是可变的,你就必须更加小心。如果是,它可能会成为应用程序的瓶颈。必须同步共享的可写状态。

如果您将“无状态”理解为“没有会话状态”,即与特定客户端的会话相关的状态,则此问题看起来相当合法(尽管措词不当)

在这些术语中,
singleton
作用域bean通常是无状态的,因为它们被多个客户端同时使用,并且它们的状态不是特定于客户端的


相反,
prototype
-作用域bean通常是在与特定客户机对话的上下文中创建的(尽管
请求
会话
作用域有时可能更合适),因此它们的状态与这些对话相关(因为如果您的bean不需要保持任何会话状态,您可以将其设置为
单例
)。从这个意义上说,
原型
bean是有状态的。

原型bean和单例bean都可以保持状态。但是,根据,“所有有状态的bean都应该使用prototype作用域,而无状态bean应该使用singleton作用域。”

无状态的singleton几乎是静态方法的集合;它与静态util类没有什么不同,实际上并不在乎有多少实例:0、1、2或无穷大

因此,单例通常是有状态的


(这就是为什么说enum中实现的singleton会自动处理序列化问题是毫无意义的。如果singleton是无状态的,则参数是无意义的;如果singleton是有状态的,则参数是无效的)

singleton不是数据对象,将singleton视为数据包装器, 访问点方法

单例可能会被销毁,但呈现状态会单独存储,并在重新创建单例后呈现
(安卓发送问候,被毁单身是臭名昭著的陷阱)

无状态bean:是单实例的bean,只初始化一次。它们唯一的状态是共享状态。这些bean是在初始化ApplicationContext时创建的。在ApplicationContext的生存期内,将返回/注入相同的bean实例


有状态bean:可以携带状态(实例变量)的bean。每次需要对象时都会创建这些bean。

另请参见:单例当然不是无状态的。有状态与无状态的概念与单例与非单例的概念完全无关(spring上下文中的原型)如果你没有保持单身状态,单身的目的是什么?
static
不够面向对象;)@nicholas-Heh没什么大不了的。我仍然认为值得一试。此外,无论什么时候,“对不起,我需要更多的咖啡。”“总是一个可行的借口!:-)模式本身没有状态。实现它的类可能