单例模式
单例模式的特点
- 某个类只有一个实例
- 它必须自行创建这个实例
- 必须自行向系统中,提供实例
懒汉式线程不安全
public class HungrySingleton {
private static HungrySingleton singleton;
public HungrySingleton(){}
public static HungrySingleton getInstance() {
if (singleton == null) {
singleton = new HungrySingleton();
}
return singleton;
}
}
懒汉式线程安全
public class HungrySingleton {
private static HungrySingleton singleton;
public HungrySingleton(){}
public static synchronized HungrySingleton getInstance() {
if (singleton == null) {
singleton = new HungrySingleton();
}
return singleton;
}
}
饿汉式线程安全
public class LazySingleton {
private static LazySingleton singleton = new LazySingleton();
private LazySingleton(){}
public static LazySingleton getInstance() {
return singleton;
}
}
双重锁/双重校验锁
/**
* 双重锁校验模式,线程安全
*/
public class DCLSingleton {
private static DCLSingleton singleton = new DCLSingleton();
private DCLSingleton(){}
public static DCLSingleton getInstance() {
if (singleton == null) {
synchronized (DCLSingleton.class) {
singleton = new DCLSingleton();
}
}
return singleton;
}
}
静态内部类
public class StaticSingleton {
private static class RegisterSingletonHolder {
private static final StaticSingleton INSTANCE = new StaticSingleton();
}
public static final StaticSingleton getInstance() {
return RegisterSingletonHolder.INSTANCE;
}
}
枚举
public enum SingletonEnum {
INSTANCE;
}