Singleton是软件开发中最常用的的设计模式之一,它有三个要点:
- 只能有一个实例(构造器私有化);
- 在内部自行创建该实例(用一个静态变量来保存唯一的实例);
- 向外部提供获得实例的方式(1. 直接暴露; 2. 用静态变量的get方法获取;)
- 饿汉式:直接创建,不存在线程安全问题
- 两种写法
-
public class Singleton { public static final Singleton INSTANCE = new Singleton(); private Singleton(){ } }
-
public class Singleton { public static final Singleton INSTANCE; static { INSTANCE = new Singleton(); } private Singleton(){ } }
直接用类名点方法,在加载类的时候实例就已经被创建,不管要要不要都会被创建。
- 懒汉式:延迟加载
public class Singleton {
public static Singleton instance;
private Singleton(){
}
public static Singleton getInstance(){
if (instance == null){
instance = new Singleton();
}
return instance;
}
}
这种方式存在线程安全问题,适用于单线程,我们来优化一下
public class Singleton {
public static Singleton instance;
private Singleton(){
}
public static Singleton getInstance(){
synchronized (Singleton.class){
if (instance == null){
instance = new Singleton();
}
}
return instance;
}
}
使用同步来实现线程安全(适用于多线程),我们还可以用内部类的方式来实现
public class Singleton {
private Singleton(){}
private static class Inner{
public static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance(){
return Inner.INSTANCE;
}
}
静态内部类不会随着外部类加载种初始化而初始化,当调用时才加载(适用于多线程)。