单例模式有哪些实现方式?
设计模式面试题发布于
一、饿汉式
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {}
public static Singleton getInstance() { return INSTANCE; }
}
类加载时即创建,线程安全,但可能浪费内存。
二、懒汉式(线程不安全)
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) instance = new Singleton();
return instance;
}
}
三、双重检查锁(DCL)
public class Singleton {
private static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) instance = new Singleton();
}
}
return instance;
}
}
volatile 防止指令重排导致拿到未初始化对象。
四、静态内部类(推荐)
public class Singleton {
private Singleton() {}
private static class Holder { static final Singleton INSTANCE = new Singleton(); }
public static Singleton getInstance() { return Holder.INSTANCE; }
}
懒加载 + 线程安全,无锁。
五、枚举
public enum Singleton { INSTANCE; }
最简洁,天然防反射和序列化破坏。