単例模式
単例模式:就是一个类只有一个实例。
- 为什么需要単例模式呢?
何时使用:当您想控制实例数目,节省系统资源的时候。比如:一个党只有一个主席
如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。
if(instance==null){
return new singleton;
}
else{
return instance;
}
关键代码:构造函数是私有的。
代码实现
- 方式1(lazy loading,线程同步)
在介绍lazy loading之前,先要介绍对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。
为什么强调初始化呢,比方说下面的这段代码
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
这就是滞后式,也就是lazy loading,因为他只是声明了静态实例,并没有为其开辟内存,也就是并没有用构造方法去构造他。
static的变量是在类装载的时候就会被初始化,即,只要类被装载,不管是否使用了static变量,都会被初始化。
- 方式2(eager loading,线程同步)
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton (){}
public static Singleton getInstance() {
return instance;
}
}
这个在类加载的时候,就进行了instance的初始化,比较耗费内存。不过,线程是安全的,因为初始的情况就已经定义好了。