单例模式的定义
单例模式(Singleton Pattern)是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。常用于需要控制资源或共享状态的场景,例如数据库连接、日志记录器等
单例模式的实现方式
饿汉式(Eager Initialization)
在类加载时直接创建实例,线程安全但可能造成资源浪费
public class EagerSingleton {
private static final EagerSingleton instance = new EagerSingleton();
private EagerSingleton() {}
public static EagerSingleton getInstance() {
return instance;
}
}
懒汉式(Lazy Initialization)
在第一次调用时创建实例,需加锁保证线程安全
public class LazySingleton {
private static LazySingleton instance;
private LazySingleton() {}
public static synchronized LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}
双重检查锁(Double-Checked Locking)
减少同步开销,仅在实例未初始化时加锁
public class DoubleCheckedSingleton {
private static volatile DoubleCheckedSingleton instance;
private DoubleCheckedSingleton() {}
public static DoubleCheckedSingleton getInstance() {
if (instance == null) {
synchronized (DoubleCheckedSingleton.class) {
if (instance == null) {
instance = new DoubleCheckedSingleton();
}
}
}
return instance;
}
}
静态内部类(Static Nested Class)
利用类加载机制保证线程安全,且延迟初始化
public class StaticNestedSingleton {
private StaticNestedSingleton() {}
private static class Holder {
static final StaticNestedSingleton INSTANCE = new StaticNestedSingleton();
}
public static StaticNestedSingleton getInstance() {
return Holder.INSTANCE;
}
}