Appearance
单例模式
定义
单例模式(Singleton Pattern)是一种常用的软件设计模式,其目的是确保一个类只有一个实例,并提供一个全局访问点来获取该实例。
使用场景
- 配置文件:在应用程序中,配置文件通常只需要加载一次,并且在整个应用程序的生命周期内保持不变。使用单例模式可以确保配置文件只被加载一次,避免重复加载和资源浪费。
- 数据库连接池:数据库连接是一种昂贵的资源,创建和销毁连接的开销较大。使用单例模式可以创建一个全局的数据库连接池,在需要使用数据库时,从连接池中获取连接,而不是每次都创建新的连接。这样可以提高应用程序的性能和效率。
- 日志记录器:日志记录器通常需要全局访问,以便在应用程序的任何地方记录日志。使用单例模式可以确保只有一个日志记录器实例,避免重复创建和销毁日志记录器实例的开销。
- 缓存:缓存是一种常用的性能优化手段,使用单例模式可以确保只有一个缓存实例,避免重复创建和销毁缓存实例的开销。
- 线程池:线程池是一种常用的多线程编程模式,使用单例模式可以确保只有一个线程池实例,避免重复创建和销毁线程池实例的开销。
- 全局状态管理:在许多应用程序中,需要全局管理一些状态信息,例如用户会话、全局配置等。使用单例模式可以确保只有一个全局状态管理实例,避免重复创建和销毁全局状态管理实例的开销。
- 全局唯一标识:在许多应用程序中,需要全局唯一标识,例如全局唯一的序列号、全局唯一的ID等。使用单例模式可以确保只有一个全局唯一标识实例,避免重复创建和销毁全局唯一标识实例的开销。
- 全局计数器:在许多应用程序中,需要全局计数器,例如全局请求计数器、全局错误计数器等。使用单例模式可以确保只有一个全局计数器实例,避免重复创建和销毁全局计数器实例的开销。
实现方式
- 饿汉式:在类加载时就创建实例,线程安全,但可能会浪费资源。
- 懒汉式:在第一次使用时创建实例,线程不安全,需要手动加锁。
- 双重检查锁定:在懒汉式的基础上,通过双重检查锁定来保证线程安全。
- 静态内部类:通过静态内部类来实现懒加载,线程安全。
- 枚举:通过枚举来实现单例,线程安全,且防止反序列化创建多个实例。
代码示例
饿汉式
java
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {
// 私有构造函数
}
public static Singleton getInstance() {
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;
}
}
双重检查锁定
java
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;
}
}
静态内部类
java
public class Singleton {
private Singleton() {
// 私有构造函数
}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
枚举
java
public enum Singleton {
INSTANCE;
public void doSomething() {
// do something
}
}