Java 什么时候单身人士不能像单身人士一样工作?

Java 什么时候单身人士不能像单身人士一样工作?,java,singleton,Java,Singleton,可能重复: 有谁能告诉我当一个Singleton不能作为一个Singleton工作时?如果一个给定的类被多个类加载器加载,那么一个Singleton(在Java领域)就不能作为一个Singleton工作。由于单个类可以存在(或可以加载)在多个类加载器中,因此对于给定的JVM实例,很可能有一个“假定的”单例类的“多个”实例。但这是一个非常罕见的案例,而且很少发生 网站上有一篇很好的帖子,作者是约书亚·福克斯。请检查一下 下面是当您的Singleton的行为不符合以下情况时的一些场景 两个或多个虚

可能重复:


有谁能告诉我当一个
Singleton
不能作为一个
Singleton
工作时?

如果一个给定的类被多个类加载器加载,那么一个Singleton(在Java领域)就不能作为一个Singleton工作。由于单个类可以存在(或可以加载)在多个类加载器中,因此对于给定的JVM实例,很可能有一个“假定的”单例类的“多个”实例。但这是一个非常罕见的案例,而且很少发生

网站上有一篇很好的帖子,作者是约书亚·福克斯。请检查一下

下面是当您的
Singleton
的行为不符合以下情况时的一些场景

  • 两个或多个虚拟机中的多个单例
  • 由不同类装入器同时装入的多个单例
  • 单例类被垃圾收集破坏,然后重新加载
  • 有目的地重新加载单例类
  • 经过序列化和反序列化的单例对象的副本

  • 这样的事情违背了单身汉的目的:

    public class BadSingleton
    {
        private BadSingleton()
        {
        }
    
        public BadSingleton getInstance()
        {
            return new BadSingleton();
        }
    }
    
    每次调用
    getInstance()
    方法时,上面将返回
    BadSingleton
    类的新实例。这将允许类的各种实例违背单例设计模式的目的


    使用多个类加载器也可以实现类似的场景(即使单例编写正确)。

    如果您能够创建多个类实例,则它不会通过克隆、反序列化等方式保持单例。

    当它编写不正确时。您是否有需要解释的具体示例?当您创建两个实例时,单例就不能作为单例使用。您能否详细说明您的问题?如果单例不能作为单例使用,则单例就不能作为单例使用。:)Java中的单例可以用不同的方式实现。添加您所指的具体实现的详细信息。@amicingh给出的链接似乎在Oracle获得Java所有权后发生了变化。我相信新的联系是,这根本不是单身,忘记好或坏。您可以讨论多个类加载器、多个JVM或其他什么,但必须有一些上下文,在这些上下文中,您的代码给出了一个单例。从来没有。我认为您在这里尝试的是采用一种实现单例的方法,并将其一半实现以产生一个bug,但它与
    new-BadSingleton()
    @mickeymoon:这不是我要说的->代码绝不会提供单例一样好吗?