【发布时间】:2011-09-29 18:10:29
【问题描述】:
您好,我在面试试卷中提出了这个问题。
有状态和无状态的单例和原型(非单例)
我不确定原型是否是无状态的?这个问题有问题吗?
【问题讨论】:
-
好吧,单例当然不是无国籍的。
-
有状态与无状态的概念与单例与非单例的概念完全无关(spring 上下文中的原型)
标签: java spring design-patterns singleton
您好,我在面试试卷中提出了这个问题。
有状态和无状态的单例和原型(非单例)
我不确定原型是否是无状态的?这个问题有问题吗?
【问题讨论】:
标签: java spring design-patterns singleton
问题本身措辞不佳。您可以在 Singletons 和 Prototypes(实例)中都有状态,因为它是法律代码,但在任何一种情况下都不需要有状态。既然提到了 Spring,我将尝试就如何使用 Spring 来回答这个问题。
就 Spring bean 范围而言,singleton 将导致 ApplicationContext 创建单个实例并在请求 bean 的任何地方使用该实例。 prototype 将导致 ApplicationContext 在每次请求 bean 时创建一个新实例。
这两个都可以是有状态的。
【讨论】:
static 不够面向对象 ;)
如果您将“无状态”理解为“没有对话状态”,即与特定客户的对话相关的状态,那么这个问题看起来很合法(尽管措辞不佳)。
在这些术语中,singleton-scoped bean 通常是无状态的,因为它们被多个客户端同时使用,并且它们的状态不是特定于客户端的。
相反,prototype-scoped bean 通常是在与特定客户端对话的上下文中创建的(尽管 request 和 session 范围有时可能更合适),因此它们的状态与那些对话(因为如果您的 bean 不需要保持任何对话状态,您可以将其设为 singleton)。从这个意义上说,prototype bean 是有状态的。
【讨论】:
原型 bean 和 Singleton bean 都可以保持状态。但是,根据the Spring documentation,“您应该对所有有状态的 bean 使用原型范围,而对无状态 bean 应该使用单例范围。”
【讨论】:
一个更好的问题可能是“单例线程安全吗?”
如果它包含的状态是只读且不可变的,则它是完全线程安全的。如果它是可变的,你只需要更加小心。如果是,它可能有成为您应用程序瓶颈的危险。必须同步该共享的可写状态。
【讨论】:
单例不是数据对象,将单例视为数据包装器, 访问点方法,
singleton 可能会被销毁,但呈现的状态是单独独立存储的,将在 singleton 重新创建后呈现 (android 发送问候,破坏单例是臭名昭著的陷阱)
【讨论】:
无状态 bean:单例且仅初始化一次的 bean。他们拥有的唯一状态是共享状态。这些 bean 是在初始化 ApplicationContext 时创建的。 SAME bean 实例将在此 ApplicationContext 的生命周期内返回/注入。 .
有状态bean:可以携带状态(实例变量)的bean。每次需要对象时都会创建它们。
【讨论】:
无状态单例几乎是静态方法的集合;它与静态 util 类没有什么不同,有多少实例并不重要:0、1、2 或无穷大。
因此,单例通常是有状态的。
(这就是为什么说在枚举中实现的单例自动解决了序列化问题是荒谬的。如果单例是无状态的,则论点是没有意义的;如果单例是有状态的,则论点被破坏了)
【讨论】: