学习目标:
- 单例模式
学习内容:
单例模式(Singleton Pattern)是一种设计模式,其主要目的是确保一个类只有一个实例,并且提供一个全局的访问点。它常用于需要全局唯一对象的场景,例如日志记录器、配置管理器、数据库连接等。
单例模式的核心思想
- 私有化构造函数:将类的构造函数定义为私有,防止外部直接创建实例。
- 提供一个静态方法或属性来获取实例:通过一个公共的静态方法或属性来访问唯一的实例。
- 确保实例的唯一性:类内部创建并保存唯一的实例,确保外部无法创建新的实例。
单例模式的实现
以Java为例,单例模式的经典实现如下:
public class Singleton {// 持有唯一实例的私有静态变量private static Singleton instance;// 私有化构造函数,防止外部实例化private Singleton() {}// 提供公共的静态方法获取实例public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}
在这个实现中:
- instance 是类的唯一实例。
- getInstance 方法在第一次调用时创建实例,并在后续调用时返回同一实例。
- 使用 synchronized 关键字确保线程安全,防止多线程环境下创建多个实例。
线程安全的改进
上述实现是线程安全的,但每次获取实例时都需要同步,可能影响性能。可以使用双重检查锁定(Double-Checked Locking)优化:
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 关键字确保实例变量的可见性和有序性。
- 双重检查锁定减少了同步开销,只有在实例为空时才进行同步。
饿汉式单例
另一种实现方式是饿汉式(Eager Initialization),即在类加载时就创建实例:
public class Singleton {private static final Singleton instance = new Singleton();private Singleton() {}public static Singleton getInstance() {return instance;}
}
这种方式简单且线程安全,但如果实例的创建依赖于其他参数或配置,可能不适用。
枚举单例
在Java中,还可以使用枚举来实现单例模式,这种方式天生是线程安全的:
public enum Singleton {INSTANCE;// 可以添加其他方法和字段public void someMethod() {// 方法实现}
}
总结
单例模式是创建型设计模式的一种,确保一个类只有一个实例,并提供全局访问点。根据具体需求和环境,可以选择不同的实现方式,如懒汉式、饿汉式或使用枚举。注意在多线程环境下的线程安全问题,选择合适的实现方式来平衡性能和安全性。