单例
单例模式详解及六种实现方式
一、单例模式的定义
单例模式确保一个类只有一个实例,并提供该实例的全局访问点。这种模式避免了频繁创建和销毁实例,从而节约系统资源。
二、单例模式的设计要素
- 私有构造函数:防止其他类创建实例。
- 私有静态变量:存储唯一实例。
- 公有静态方法:提供全局访问点。
三、单例模式的六种实现及其优缺点
1. 懒汉式(线程不安全)
- 实现:
public class Singleton {
private static Singleton instance;
// 私有构造函数防止外部实例化
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
- 优点:延迟实例化,节约资源。
- 缺点:线程不安全,多线程环境下可能实例化多个实例。
2. 饿汉式(线程安全)
- 实现:
public class Singleton {
public class Singleton {
private static final Singleton instance = new Singleton();
// 私有构造函数防止外部实例化
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
}
- 优点:提前实例化,避免线程安全问题。
- 缺点:可能浪费系统资源。
3. 懒汉式(线程安全)
- 实现:
public class Singleton {
private static Singleton uniqueInstance;
private static singleton() {
}
private static synchronized Singleton getUinqueInstance() {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
- 优点:延迟实例化,节约资源,线程安全。
- 缺点:性能降低。
4. 双重检查锁实现(线程安全)
- 实现:
public class Singleton {
private volatile static Singleton uniqueInstance;
private Singleton() {
}
public static Singleton getUniqueInstance() {
if (uniqueInstance == null) {
synchronized (Singleton.class) {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
- 优点:延迟实例化,节约资源,线程安全,性能提高。
- 缺点:对性能有些影响。
5. 静态内部类实现(线程安全)
- 实现:
public class Singleton {
private Singleton() {
}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getUniqueInstance() {
return SingletonHolder.INSTANCE;
}
}
- 优点:延迟实例化,节约资源,线程安全,性能提高。
6. 枚举类实现(线程安全)
- 实现:
public enum Singleton {
INSTANCE;
//添加自己需要的操作
public void doSomeThing() {
}
}
- 优点:简单、线程安全、防止反射和反序列化调用。
四、单例模式的应用场景
- 网站计数器。
- 应用程序的日志应用。
- Web项目中的配置对象的读取。
- 数据库连接池。
- 多线程池等。
单例模式适用于频繁实例化又销毁的对象,或者经常使用但实例化耗费资源的对象。
在Spring中,单例模式是一种常见的设计模式,被广泛运用于Bean的管理。在Spring中,默认情况下,所有的Bean都是单例的,这意味着在整个应用程序生命周期中,Spring容器只会创建一个共享的实例。
Spring中的单例模式应用:
-
默认单例:Spring容器在启动时创建Bean实例,并在整个应用程序中共享这个实例。
-
配置单例:通过在Bean定义中设置
scope="singleton"
来明确指定一个Bean为单例。
<bean id="mySingletonBean" class="com.example.MySingletonBean" scope="singleton"/>
- 注解方式:通过在类上使用
@Component
或其他专门的注解,Spring容器会自动将该类注册为单例Bean。
@Component
public class MySingletonBean {
// Bean properties and methods
}
-
生命周期管理:Spring容器负责管理单例Bean的生命周期,包括实例化、初始化、调用和销毁。
-
线程安全性:Spring容器确保单例Bean的线程安全性,可以在多线程环境中正确地管理和使用单例Bean。