【设计模式】单例模式
单例模式深度解析:从基础到实现原理一、单例模式核心概念
单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供该实例的全局访问点。这种模式的核心价值在于:
[*]✅ 避免资源冲突(如配置文件、数据库连接池)
[*]✅ 节省系统资源开销
[*]✅ 统一管理共享资源
[*]✅ 控制全局访问点
典型应用场景:
[*]配置管理器(全局共享配置)
[*]数据库连接池(避免重复创建连接)
[*]日志记录器(统一管理日志写入)
[*]设备驱动程序(如打印机控制)
[*]缓存系统(全局共享缓存数据)
二、单例模式实现方式大全
1. 饿汉式(线程安全)
public class EagerSingleton {
private static final EagerSingleton INSTANCE = new EagerSingleton();
private EagerSingleton() {
// 防止反射攻击
if (INSTANCE != null) {
throw new IllegalStateException("Singleton already initialized");
}
}
public static EagerSingleton getInstance() {
return INSTANCE;
}
}
[*]⚡ 优点:实现简单,线程安全
[*]⚠️ 缺点:类加载时即初始化,可能造成资源浪费
2. 懒汉式(非线程安全)
public class LazySingleton {
private static LazySingleton instance;
private LazySingleton() {}
public static LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}
[*]⚡ 优点:延迟初始化
[*]⚠️ 缺点:多线程环境下不安全
3. 同步方法懒汉式(线程安全)
public class SynchronizedSingleton {
private static SynchronizedSingleton instance;
private SynchronizedSingleton() {}
public static synchronized SynchronizedSingleton getInstance() {
if (instance == null) {
instance = new SynchronizedSingleton();
}
return instance;
}
}
[*]⚡ 优点:线程安全
[*]⚠️ 缺点:每次获取实例都加锁,性能差
4. 双重检查锁(DCL)
public class DoubleCheckedLockingSingleton {
private static volatile DoubleCheckedLockingSingleton instance;
private DoubleCheckedLockingSingleton() {}
public static DoubleCheckedLockingSingleton getInstance() {
if (instance == null) {
synchronized (DoubleCheckedLockingSingleton.class) {
if (instance == null) {
instance = new DoubleCheckedLockingSingleton();
}
}
}
return instance;
}
}
[*]⚡ 优点:线程安全且高性能
[*]⚠️ 注意:必须使用volatile防止指令重排序
5. 静态内部类(推荐)
public class StaticInnerClassSingleton {
private StaticInnerClassSingleton() {}
private static class Holder {
static final StaticInnerClassSingleton INSTANCE = new StaticInnerClassSingleton();
}
public static StaticInnerClassSingleton getInstance() {
return Holder.INSTANCE;
}
// 防止反序列化破坏单例
protected Object readResolve() {
return getInstance();
}
}6. 枚举单例(最佳实践)
public enum EnumSingleton {
INSTANCE;
// 添加业务方法
public void businessMethod() {
System.out.println("Business logic executed");
}
}三、静态内部类原理深度剖析
静态内部类实现之所以无需同步开销,关键在于利用了Java类加载机制的天然线程安全性:
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]