151
社区成员
发帖
与我相关
我的任务
分享** 单例模式(Singleton Pattern)** 是一种创建型设计模式,其核心是:保证一个类在整个程序中只有一个实例,并提供一个全局访问点获取该实例。
简单理解:
private),禁止外部 newpublic static)特点:类加载就初始化,天生线程安全,但可能浪费内存。
java
public class Singleton {
// 1. 静态常量,类加载时就创建
private static final Singleton INSTANCE = new Singleton();
// 2. 构造器私有化
private Singleton() {}
// 3. 全局访问点
public static Singleton getInstance() {
return INSTANCE;
}
}
优点:简单、线程安全、无锁、效率高缺点:不用也会创建,可能造成内存浪费
特点:延迟加载,但多线程下会产生多个实例。
java
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
缺点:多线程并发下会产生多个实例,严禁在多线程环境使用
在方法上加锁,保证线程安全,但并发效率极低。
java
public class Singleton {
private static Singleton instance;
private Singleton() {}
// 加锁保证线程安全
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
优点:线程安全缺点:每次获取都加锁,并发性能差
Double-Check Locking,兼顾线程安全 + 高性能 + 延迟加载。
java
public class Singleton {
// volatile 禁止指令重排
private static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
// 第一次检查:不加锁
if (instance == null) {
synchronized (Singleton.class) {
// 第二次检查:加锁后再判断
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
优点:
注意:必须加 volatile,防止指令重排导致空指针。
利用类加载机制保证单例,代码极简洁。
java
public class Singleton {
private Singleton() {}
// 静态内部类,只有被调用时才加载
private static class Holder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return Holder.INSTANCE;
}
}
优点:
推荐程度:极高
java
public enum Singleton {
INSTANCE;
public void method() {
// 业务方法
}
}
使用:
java
Singleton instance = Singleton.INSTANCE;
优点:
反射破坏反射可以强制调用私有构造器,创建多个对象。防范:枚举单例天然防反射。
序列化 / 反序列化破坏反序列化会生成新对象。防范:枚举天然防序列化;普通单例重写 readResolve()。