单例模式几种实现

发布于:2025-02-10 ⋅ 阅读:(16) ⋅ 点赞:(0)

静态内部类holder实现(推荐)

public class UniqueIdGenerator {
    public static final UniqueIdGenerator INSTANCE = Holder.INSTANCE;

    // Private holder class for lazy initialization
    private static class Holder {
        static final UniqueIdGenerator INSTANCE = new UniqueIdGenerator();
    }
    // Private constructor to prevent instantiation
    private UniqueIdGenerator() {
        // No need for reflection protection here since we're using holder pattern
    }
}

好处:懒加载,真正使用时才加载在,不占用内存。代码简洁性相对双重检查锁高。

双重检查锁实现

public class UniqueIdGenerator {
    // 使用 volatile 关键字保证可见性和禁止指令重排序
    private static volatile UniqueIdGenerator INSTANCE;

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

    // 公共静态方法,用于获取单例实例
    public static UniqueIdGenerator getInstance() {
        // 第一次检查,避免不必要的同步
        if (INSTANCE == null) {
            // 同步代码块,确保只有一个线程能进入创建实例
            synchronized (UniqueIdGenerator.class) {
                // 第二次检查,防止多个线程同时通过第一次检查后重复创建实例
                if (INSTANCE == null) {
                    INSTANCE = new UniqueIdGenerator();
                }
            }
        }
        return INSTANCE;
    }
}

经典单例模式(不推荐)

饿汉式(线程安全)

public class UniqueIdGenerator {
    // 在类加载时就创建单例实例
    private static final UniqueIdGenerator INSTANCE = new UniqueIdGenerator();

    // 私有构造函数,防止外部实例化
    private UniqueIdGenerator() {
        // 可以在这里添加初始化逻辑
    }

    // 公共静态方法,用于获取单例实例
    public static UniqueIdGenerator getInstance() {
        return INSTANCE;
    }
}

懒汉式单例模式(线程不安全)

public class UniqueIdGenerator {
    // 单例实例
    private static UniqueIdGenerator INSTANCE;

    // 私有构造函数,防止外部实例化
    private UniqueIdGenerator() {
        // 可以在这里添加初始化逻辑
    }

    // 公共静态方法,用于获取单例实例
    public static UniqueIdGenerator getInstance() {
        if (INSTANCE == null) {
            INSTANCE = new UniqueIdGenerator();
        }
        return INSTANCE;
    }
}

更多可以参考下面,讲的很全。
https://zhuanlan.zhihu.com/p/93255556


网站公告

今日签到

点亮在社区的每一天
去签到