Singleton什么时候不能作为Singleton工作?
可能重复:
用其他方式破解单身人士
当Singleton
不能作为Singleton
工作时,有人能告诉我吗?
作者Joshua Fox在Sun网站上发布了很好的post。 请仔细阅读。
下面是其中一些情况,当你的Singleton
不表现时。
- 两个或更多虚拟机中的多个单身人士
- 不同类加载器同时加载多个单身人士
- 单例类由垃圾收集销毁,然后重新加载
- 有目的地重装单身人士课程
- 已经过序列化和反序列化的Singleton对象的副本
如果给定的类由多个类加载器加载,则单例(在Java领域中)将不能作为单例工作。 由于单个类可以在多个类加载器中存在(或者可以加载),因此对于给定的JVM实例,很可能具有“所谓的”单例类的“多个”实例。 但这是一个非常罕见的情况,并没有发生太多。 🙂
请使用此链接。 希望这能帮助你更好地http://java.sun.com/developer/technicalArticles/Programming/singletons/
如果您能够创建多个类的实例,那么它不会通过使用克隆,反序列化等方式保持单例。
这样的事情会违背Singleton的目的:
public class BadSingleton { private BadSingleton() { } public BadSingleton getInstance() { return new BadSingleton(); } }
每次调用getInstance()
方法时,上面将返回BadSingleton
类的新实例。 这将允许类的各种实例违反Singleton设计模式的目的。
通过使用多个类加载器也可以实现类似的场景(即使正确编写了Singleton)。