单例模式详解

一、概念与定义

单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问该实例。这种模式适用于需要控制资源访问、限制实例数量的场景。

核心特性

  1. 唯一实例:在应用程序整个生命周期中,单例类只能有一个实例存在。

  2. 全局访问:通过静态方法或属性提供全局访问点。

  3. 延迟初始化:实例通常在第一次被请求时才创建。

单例模式分两种,懒汉式单例饿汉式单例 ,又分别有传统实现优化实现两种方式

二、懒汉式

懒汉式单例是一种延迟初始化的单例实现方式,只有在第一次需要使用单例对象时才进行实例化。相比饿汉式单例,懒汉式能够避免程序启动时就加载对象,从而节省系统资源。但线程不安全,适合单线程环境。通常需要加锁解决并发冲突,是用时间换空间的方案

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;
    }
}
相关推荐
啦啦啦啦啦zzzz10 天前
设计模式:单例模式和工厂模式
c++·单例模式·设计模式·工厂模式
空杆推不起10 天前
金融数仓标准化:信贷业务 ODS/DWD/DWS/ADS/DIM 全层级建模指南
单例模式·金融
芝士熊爱编程18 天前
创建型模式-单例模式
java·单例模式·设计模式
张小姐的猫20 天前
【Linux】网络编程 —— HTTP协议(上)
linux·运维·服务器·网络·http·单例模式·策略模式
zjun100120 天前
C++:单例模式
c++·单例模式
ttod_qzstudio1 个月前
【软考设计模式】单例模式:唯一实例的管控与线程安全精讲
单例模式·设计模式
geovindu1 个月前
java: Singleton Pattern
java·开发语言·后端·单例模式·设计模式·创建型模式
重生之我是Java开发战士2 个月前
【Java SE】多线程(三):单例模式,阻塞队列,线程池与定时器
java·javascript·单例模式
许彰午2 个月前
34_Java设计模式之单例模式
java·单例模式·设计模式
罗超驿2 个月前
10.Java单例模式全解析:饿汉式与懒汉式实现及线程安全深度剖析
安全·单例模式·javaee