单例模式几种实现
静态内部类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