繁体   English   中英

单身有状态吗?

[英]Is singleton stateful?

嗨,我在面试问题文件中得到了这个问题。

单身和原型(非单身)是有状态的,是无国籍的

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

这个问题本身措辞不力。 您可以在Singletons和Prototypes(实例)中拥有状态,因为它是合法代码,但在任何一种情况下您都不需要具有状态。 自提到Spring之后,我将尝试回答有关使用Spring的问题。

就Spring bean范围而言, singleton将使ApplicationContext创建单个实例,并在要求bean的每个地方使用该实例。 每次要求bean时, prototype都会导致ApplicationContext创建一个新实例。

它们都可以是有状态的。

原型bean和Singleton bean都可以保持状态。 但是,根据Spring文档 ,“您应该将原型范围用于所有有状态的bean,而单例范围应该用于无状态bean。”

如果您将“无状态”视为“没有会话状态”,即与特定客户的对话相关的状态,则此问题看起来非常合法(尽管措辞不佳)。

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

相反, prototype -scoped bean通常是在与特定客户端的对话环境中创建的(尽管requestsession范围有时可能更合适),因此他们的状态与这些对话相关(因为如果你的bean没有'需要保持任何会话状态,你可以使它成为singleton )。 在这个意义上, prototype bean是有状态的。

singleton不是数据对象,想想singleton作为数据包装器,访问点的方法,

单身人士可能会被摧毁,但呈现的状态是分开独立存储的,并且会在单人重建后呈现出来(android发送问候,毁坏的单身人士是臭名昭着的陷阱)

一个更好的问题可能是“Singleton线程安全吗?”

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

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

因此,单身人士通常是有状态的。

(这就是为什么认为在枚举中实现的单例自动处理序列化问题是荒谬的。单例是无状态的,参数是没有意义的;如果单例是有状态的,则参数被破坏)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM