单例模式:确保一个类只有一个实例的策略
单例模式是一种常用的软件设计模式,它确保一个类在其整个生命周期中只有一个实例,并提供了一个全局访问点。这种模式常用于管理共享资源,如配置信息、线程池、缓存等。
单例模式的实现方式
单例模式有多种实现方式,包括懒汉式、饿汉式、双重校验锁、静态内部类等。
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;
}
}
4. 静态内部类
静态内部类利用了类加载的机制来实现线程安全的单例模式。
public class Singleton {
private Singleton() {}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
Spring Boot 中的单例模式应用
在 Spring Boot 开发中,单例模式被广泛使用,因为 Spring 容器默认管理的 Bean 都是单例的。以下是一些常见的应用场景:
1. 配置管理
Spring Boot 中的配置对象通常是单例的,因为配置信息不会频繁变动。
@Configuration
public class AppConfig {
@Bean
@Singleton
public ConfigProperties configProperties() {
return new ConfigProperties();
}
}
2. 数据源连接池
数据库连接池如 HikariCP,通常配置为单例,因为它们是昂贵的资源。
@Configuration
public class DatabaseConfig {
@Bean
@Singleton
public DataSource dataSource() {
return new HikariDataSource();
}
}
3. 线程池
线程池也是单例的,因为它们管理着线程的生命周期。
@Configuration
public class ThreadPoolConfig {
@Bean
@Singleton
public ExecutorService executorService() {
return Executors.newFixedThreadPool(10);
}
}
4. 缓存管理
Spring Boot 中的缓存管理器,如 EhCacheManager,也是单例的。
@Configuration
public class CacheConfig {
@Bean
@Singleton
public CacheManager cacheManager() {
return new EhCacheManager();
}
}
结语
单例模式是确保一个类只有一个实例的有效手段,它在资源管理和配置信息共享方面非常有用。在 Spring Boot 中,单例模式被用于管理全局的配置、连接池、线程池等。通过理解单例模式的实现和应用,开发者可以更好地控制应用的资源和行为。