一、概念与定义
单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问该实例。这种模式适用于需要控制资源访问、限制实例数量的场景。
核心特性
-
唯一实例:在应用程序整个生命周期中,单例类只能有一个实例存在。
-
全局访问:通过静态方法或属性提供全局访问点。
-
延迟初始化:实例通常在第一次被请求时才创建。
单例模式分两种,懒汉式单例 和饿汉式单例 ,又分别有传统实现 和优化实现两种方式
二、懒汉式
懒汉式单例是一种延迟初始化的单例实现方式,只有在第一次需要使用单例对象时才进行实例化。相比饿汉式单例,懒汉式能够避免程序启动时就加载对象,从而节省系统资源。但线程不安全,适合单线程环境。通常需要加锁解决并发冲突,是用时间换空间的方案
1、传统实现代码
java
public class LazySingleton {
private static LazySingleton instance;
private LazySingleton() {} // 私有构造函数
public static LazySingleton getInstance() {
if (instance == null) { // 第一次检查
instance = new LazySingleton(); // 延迟初始化
}
return instance;
}
}
2、优化代码实现
使用volatile关键字防止指令重排序;双重检查锁定(DCL)减少同步开销;只在第一次创建时同步,之后直接返回实例。
java
public class ThreadSafeLazySingleton {
private static volatile ThreadSafeLazySingleton instance;
private ThreadSafeLazySingleton() {}
public static ThreadSafeLazySingleton getInstance() {
if (instance == null) { // 第一次检查
synchronized (ThreadSafeLazySingleton.class) { // 加锁
if (instance == null) { // 第二次检查(双重检查锁定)
instance = new ThreadSafeLazySingleton();
}
}
}
return instance;
}
}
三、饿汉式
饿汉式是单例模式中最简单的一种实现方式,它在类加载时就完成了实例化,避免了线程同步的问题。其特点是类一旦加载就创建单例对象,确保在任何线程访问之前就已经初始化完成。
1、传统实现代码
java
public class Singleton {
// 1. 静态私有成员变量,类加载时即初始化
private static Singleton instance = new Singleton();
// 2. 私有构造函数,防止外部实例化
private Singleton() {}
// 3. 静态公有方法,获取唯一实例
public static Singleton getInstance() {
return instance;
}
}
2、优化实现代码
针对传统饿汉式可能存在的资源浪费问题,可以通过静态内部类的方式实现延迟加载,同时保持线程安全。
java
public class Singleton {
// 1. 私有构造函数
private Singleton() {}
// 2. 静态内部类
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
// 3. 获取实例方法
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}