xChar
·10 days ago

单例模式确保一个类只有一个实例,并提供一个全局访问点。

在 Java 中,实现单例模式有如下几种常见的方法。

饿汉式

饿汉式在类加载时就创建实例,线程安全但可能会浪费内存。

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

    // 私有化构造函数,防止外部实例化
    private Singleton() {}

    // 提供全局访问点
    public static Singleton getInstance() {
        return INSTANCE;
    }
}

线程不安全的懒汉式

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

public class Singleton {
    private static Singleton instance;

    private Singleton() {}

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

线程安全的懒汉式

通过同步方法,确保多线程环境下也只有一个实例。

public class Singleton {
    private static Singleton instance;

    private Singleton() {}

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

双重锁定检查

在同步块内外都检查实例是否已创建,减少了同步开销。

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

静态内部类

使用静态内部类,线程安全且延迟加载。

public class Singleton {
    private Singleton() {}

    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

枚举

最简单的一种实现方式,推荐使用。线程安全,支持序列化并且能够防止反射攻击。

public enum Singleton {
    INSTANCE;

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

参考资料

Loading comments...