单例模式:其变量只有一份,即通过设置为static实现只有一份的要求
为什么反射能破坏单例模式?
解:因为单例模式类的构造器是私有的,因此不能在其他类中通过"new 类名(参数…);"调用构造器来创建对象,只能通过调用单例类中的创建静态对象的方法(详见下面例子中的getInstance()方法)来获取对象(单例类对象是静态的,全局只能有一个对象)。然而,反射可以无视构造器私有的限制,其仍能通过构造方法创建普通对象(非静态对象,不是全局唯一的),反射可以创建多个不同的非静态的普通对象,导致对象不唯一,破坏了单例模式。
1. 问题出现
在实现单例模式时,如果未考虑多线程的情况,就容易写出下面的错误代码:
public class Singleton {
private static Singleton uniqueSingleton;
//单例模式下要求构造器私有
private Singleton() {
}
public static Singleton getInstance() {
if (null == uniqueSingleton) {
uniqueSingleton = new Singleton();
}
return uniqueSingleton;
}
}
单例模式uniqueSingleton
是静态变量,只应该存在一份实例化对象,而在多线程的情况下,上述那样写可能会导致uniqueSingleton
有多个