单例模式
251字小于1分钟
2024-08-08
饿汉式
public class HungrySingleton {
// 缺点:可能会浪费空间,比如 private byte[] data = new byte[1024 * 1024];
private final static HungrySingleton HUNGRY = new HungrySingleton();
private HungrySingleton{}
public static HungrySingleton getInstance() {
return HUNGRY;
}
}
懒汉式
public class LazySingleton {
private LazySingleton{}
private static LazySingleton lazySingleton;
public static LazySingleton getInstance() {
// 并发下存在问题,需要加锁
if (lazySingleton == null) {
lazySingleton = new LazySingleton();
}
return lazySingleton;
}
}
双重检测锁
双重检测锁模式的懒汉式单例,DCL
懒汉式
public class LazySingleton {
private volatile static LazySingleton lazySingleton;
private LazySingleton{}
public static LazySingleton getInstance() {
if (lazySingleton == null) {
synchronized (LazySingleton.class) {
if (lazySingleton == null) {
// 不加 volitle 存在问题:不是原子性操作,有可能发生指令重排
// 1、分配内存空间
// 2、执行构造方法,初始化对象
// 3、把这个对象指向这个口那个键
lazySingleton = new LazySingleton();
}
}
}
return lazySingleton;
}
}
静态内部类
public class Holder {
private Holder() {}
public static Holder getInstance() {
return InnerClass.HOLDER;
}
public static class InnerClass {
private static final Holder HOLDER = new Holder();
}
}
枚举
enum
本身也是一个 Class
类
public enum EnumSingleton {
INSTANCE;
public EnumSingleton getInstance() {
return INSTANCE;
}
}