【设计模式系列】单例模式(二十)

一、什么是单例模式

单例模式(Singleton Pattern)是一种常用的软件设计模式,属于创建型模式。它的目的是确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。

单例模式的主要特点包括:

  1. 唯一性:单例类在整个应用程序的生命周期内只创建一个实例。
  2. 全局访问点:提供了一个全局的访问点,确保所有访问该类的地方都访问的是同一个实例。
  3. 延迟初始化:单例实例通常在第一次被使用时创建(懒汉式),也可以在程序启动时立即创建(饿汉式)。

二、单例模式的典型实现案例

2.1 懒汉式(线程不安全)

  • 这种方式下,实例在第一次被使用时才创建。这种方式简单,但在多线程环境下可能会出现多个实例的问题。
java 复制代码
public class Singleton {
    private static Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

2.2 饿汉式(线程安全)

  • 在类加载时就立即初始化单例,这种方式避免了多线程的同步问题,但可能导致资源的浪费,因为不管是否使用,单例都会被创建。
java 复制代码
public class Singleton {
    private static final Singleton instance = new Singleton();

    private Singleton() {}

    public static Singleton getInstance() {
        return instance;
    }
}

2.3 双重校验锁(Double-Checked Locking,线程安全,推荐方式)

  • 这种方式在获取实例时先检查实例是否已经创建,如果没有创建才进入同步块中创建实例。这种方式既保证了线程安全,又避免了每次访问都进行同步的开销。
java 复制代码
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;
    }
}

2.4 静态内部类(线程安全)

  • 这种方式利用了类加载机制来保证初始化实例时只有一个线程,同时也实现了延迟加载。
java 复制代码
public class Singleton {
    private Singleton() {}

    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

单例模式适用于需要全局只有一个实例的场景,如配置管理器、线程池、缓存等。然而,过度使用单例可能会导致代码的耦合度高,难以测试和维护。因此,在设计时需要根据实际需求谨慎使用单例模式。

相关推荐
方圆想当图灵7 分钟前
缓存之美:万文详解 Caffeine 实现原理(下)
java·redis·缓存
栗豆包22 分钟前
w175基于springboot的图书管理系统的设计与实现
java·spring boot·后端·spring·tomcat
等一场春雨1 小时前
Java设计模式 十四 行为型模式 (Behavioral Patterns)
java·开发语言·设计模式
酱学编程2 小时前
java中的单元测试的使用以及原理
java·单元测试·log4j
我的运维人生2 小时前
Java并发编程深度解析:从理论到实践
java·开发语言·python·运维开发·技术共享
一只爱吃“兔子”的“胡萝卜”2 小时前
2.Spring-AOP
java·后端·spring
HappyAcmen2 小时前
Java中List集合的面试试题及答案解析
java·面试·list
Ase5gqe2 小时前
Windows 配置 Tomcat环境
java·windows·tomcat
大乔乔布斯3 小时前
JRE、JVM 和 JDK 的区别
java·开发语言·jvm
湫qiu3 小时前
带你写HTTP/2, 实现HTTP/2的编码
java·后端·http