懒汉式
public class LazySingleton {
private static LazySingleton instance = null;
private LazySingleton() {
}
public static LazySingleton getInstance() {
if (null == instance) {
instance = new LazySingleton();
}
return instance;
}
}
线程不安全
饿汉式
public class HungrySingleton {
private static HungrySingleton instance = new HungrySingleton();
private HungrySingleton() {
}
public static HungrySingleton getInstance() {
return instance;
}
}
线程安全
不能实现懒加载,浪费资源
DCL双重检查
public class DCLSingleton {
private static volatile DCLSingleton instance = null;
private DCLSingleton() {
}
public static DCLSingleton getInstance() {
if (null == instance) {
synchronized (DCLSingleton.class) {
if (null == instance) {
instance = new DCLSingleton();
}
}
}
return instance;
}
}
线程安全
懒加载
volatile是为了防止代码重排(指令重排)
Holder懒加载
public class HolderSingleton {
private HolderSingleton() {
}
private static class In {
private static HolderSingleton instance = new HolderSingleton();
}
public static HolderSingleton getInstance() {
return In.instance;
}
}
线程安全
懒加载
内部类调用时才会初始化
枚举模式
public class EnumSingleton {
private EnumSingleton() {
}
private enum In {
INSTANCE;
private EnumSingleton instance;
In() {
instance = new EnumSingleton();
}
}
public static EnumSingleton getInstance() {
return In.INSTANCE.instance;
}
}
线程安全
懒加载
枚举的常量是枚举的单例对象.
内部类调用时才会初始化