1. 饿汉式单例(Eager Initialization)

饿汉式单例在类加载时就创建实例,线程安全,但可能会造成资源浪费。

public class EagerSingleton {
    private static final EagerSingleton INSTANCE = new EagerSingleton();

    private EagerSingleton() {}

    public static EagerSingleton getInstance() {
        return INSTANCE;
    }
}

2 懒汉式单例(Lazy Initialization)

懒汉式单例在第一次调用 getInstance 方法时创建实例,线程不安全。

public class LazySingleton {
    private static LazySingleton instance;

    private LazySingleton() {}

    public static LazySingleton getInstance() {
        if (instance == null) {
            instance = new LazySingleton();
        }
        return instance;
    }
}

3 线程安全的懒汉式单例(Thread-Safe Lazy Initialization)

通过同步方法实现线程安全的懒汉式单例,但性能较低。

public class ThreadSafeLazySingleton {
    private static ThreadSafeLazySingleton instance;

    private ThreadSafeLazySingleton() {}

    public static synchronized ThreadSafeLazySingleton getInstance() {
        if (instance == null) {
            instance = new ThreadSafeLazySingleton();
        }
        return instance;
    }
}

4 双重检查锁定(Double-Checked Locking)

双重检查锁定在保证线程安全的同时,减少了同步开销。

public class DoubleCheckedLockingSingleton {
    private static volatile DoubleCheckedLockingSingleton instance;

    private DoubleCheckedLockingSingleton() {}

    public static DoubleCheckedLockingSingleton getInstance() {
        if (instance == null) {
            synchronized (DoubleCheckedLockingSingleton.class) {
                if (instance == null) {
                    instance = new DoubleCheckedLockingSingleton();
                }
            }
        }
        return instance;
    }
}

5 静态内部类(Bill Pugh Singleton)

利用静态内部类的特性实现懒加载和线程安全。

public class BillPughSingleton {
    private BillPughSingleton() {}

    private static class SingletonHelper {
        private static final BillPughSingleton INSTANCE = new BillPughSingleton();
    }

    public static BillPughSingleton getInstance() {
        return SingletonHelper.INSTANCE;
    }
}

6. 枚举单例(Enum Singleton)

枚举单例是实现单例模式的最佳方式,天然支持序列化和线程安全。

public enum EnumSingleton {
    INSTANCE;

    public void someMethod() {
        // 方法实现
    }
}