banner
Tenifs

Tenifs

雄关漫道真如铁,而今迈步从头越。
github
follow
zhihu
email

Java 实现单例模式

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

在 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() {
        // 实例方法
    }
}

参考资料#

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。