饿汉式
单例模式的最简单实现如下:
public class Singleton implements Serializable {
private static Singleton instance = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}
这种写法被称为“饿汉式”,在类加载阶段就初始化单例对象,因为是在线程出现之前实例化,所以不存在线程安全问题。
饿汉式开发效率和执行效率都比较高,也不存在线程安全问题,但饿汉式实现的单例从进程/虚拟机创建开始就占用一部分内存,并且容易被clone()方法、反射和反序列化破坏。
枚举式
正如所有被class修饰的类都是java.lang.Obejct的子类一样,所有被enum修饰的类也都是java.lang.Enum的子类,
public enum EnumSingleton {
INSTANCE;
private Object data;
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public static EnumSingleton getInstance(){return INSTANCE;}
}
因为JDK的内部机制,枚举式单例是线程安全的,也不存在被clone()方法、反射和反序列化破坏的问题。
又因为枚举式本质上也是一种饿汉式,所以也存在从一开始就占有部分内存的问题。