强者的自我修养免安装绿色中文版
4.29G · 2025-11-02
单例模式确保一个类仅有一个实例,并提供一个全局访问点来获取该实例。它的核心是 “控制实例数量”,避免重复创建消耗资源的对象(如数据库连接池、配置管理器)。
new 关键字创建实例;“饿汉式” 在类加载时就创建实例,避免线程安全问题,但如果实例未被使用,会提前占用内存。
public class HungrySingleton {
// 1. 私有静态成员变量:类加载时创建唯一实例
private static final HungrySingleton INSTANCE = new HungrySingleton();
// 2. 私有构造函数:禁止外部new
private HungrySingleton() {}
// 3. 公有静态方法:返回实例
public static HungrySingleton getInstance() {
return INSTANCE;
}
}
“懒汉式” 在首次调用 getInstance() 时才创建实例,节省内存,但需额外处理线程安全(否则多线程下可能创建多个实例)。
线程安全优化版(双重检查锁定) :
public class LazySingleton {
// 1. 私有静态成员变量:volatile防止指令重排序(关键!)
private static volatile LazySingleton INSTANCE;
// 2. 私有构造函数
private LazySingleton() {}
// 3. 公有静态方法:双重检查锁定
public static LazySingleton getInstance() {
// 第一次检查:避免已创建实例时的锁竞争
if (INSTANCE == null) {
synchronized (LazySingleton.class) {
// 第二次检查:防止多线程同时进入第一个检查后重复创建
if (INSTANCE == null) {
INSTANCE = new LazySingleton();
}
}
}
return INSTANCE;
}
}
利用 Java “静态内部类加载时机” 的特性:内部类在被调用时才加载,既实现延迟加载,又天然避免线程安全问题(类加载过程由 JVM 保证线程安全)。
public class StaticInnerClassSingleton {
// 1. 私有构造函数
private StaticInnerClassSingleton() {}
// 2. 静态内部类:存储唯一实例
private static class SingletonHolder {
private static final StaticInnerClassSingleton INSTANCE = new StaticInnerClassSingleton();
}
// 3. 公有静态方法:调用内部类的实例
public static StaticInnerClassSingleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
系统中只能有一个实例的对象,如:
DataSource);Serializable,需重写 readResolve() 方法,否则反序列化会创建新实例;