单例模式有哪些实现方式?

设计模式面试题发布于

一、饿汉式

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; }

最简洁,天然防反射和序列化破坏。