单例模式(Singleton Pattern)是一种常用的软件设计模式,用于确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。单例模式的核心思想是控制对象的创建过程,使得类的实例在程序运行期间始终保持唯一性
单例模式分类:懒汉式、饿汉式、双重校验锁、静态内部类、枚举
1、懒汉式(线程安全)
优点:线程安全。
缺点:每次调用getInstance()
都会同步,效率较低。
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
2、饿汉式(线程安全)
饿汉式单例模式在类加载时就初始化实例,简单且线程安全
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
优点:线程安全,实现简单。
缺点:实例在类加载时就初始化,可能会浪费资源(如果实例化成本高且不常用)。
3、双重校验锁式
双重校验锁是一种高效的单例实现方式,适用于懒汉式初始化。
public class Singleton {
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
关键字确保instance
的可见性和禁止指令重排序。
4、静态内部类
静态内部类是一种优雅且高效的单例实现方式。
public class Singleton {
private Singleton() {}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
优点:线程安全,延迟加载,实现简单。
原理:利用Java的类加载机制,SingletonHolder
类在第一次调用getInstance()
时才会被加载,从而初始化INSTANCE
。
5、枚举实现
枚举实现是一种天然线程安全的单例实现方式。