墨风如雪博客

  • 源码小店
  • 导航站
  • 登录
  • java
  • 资源分享
让AI使用变得如此简单
  1. 首页
  2. java
  3. 设计模式
  4. 正文

设计模式:单例设计模式

2023年 5月 6日 160点热度 0人点赞 0条评论

什么是单例设计模式?

单例设计模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点。在许多情况下,我们只需要一个对象来协调系统的操作,这时候使用单例模式可以很好地满足这种需求。下面详细介绍单例设计模式的原理、实现和使用。

核心思想

单例设计模式的核心思想是:一个类只能有一个实例,并且该实例必须由自己创建。实现单例模式的关键在于控制实例的创建过程,并提供一个全局访问点。通常情况下,单例模式有以下三个要素:

  1. 私有的构造函数,禁止外部创建实例。
  2. 静态的实例变量,用于存放唯一的实例。
  3. 静态的访问方法,提供全局访问点,允许外部获取唯一的实例。

除了饿汉式和懒汉式单例模式之外,还有其他几种实现单例模式的方式。下面分别介绍它们的原理、实现和使用。

1. 静态内部类单例模式

静态内部类单例模式也是一种懒汉式单例模式,它采用了Java语言本身的特性,即JVM在类的初始化阶段,会保证线程安全。利用这个特性,我们可以实现懒加载的线程安全单例模式。

原理

在Java中,类的初始化过程是线程安全的,这是由JVM自身的机制保证的。因此,我们可以利用这个机制,实现懒加载的线程安全单例模式。

静态内部类单例模式的原理是:在外部类初始化的过程中,静态内部类不会被初始化。只有在第一次使用内部类时,才会初始化它。这样可以保证单例对象的懒加载和线程安全。

实现

public class Singleton {
    private Singleton() {}

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

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

上面的代码中,我们将Singleton类的构造函数定义成私有的,禁止外部创建实例。然后,我们定义了一个静态内部类SingletonHolder,该类中定义了一个静态变量INSTANCE,用于存放唯一的实例。在getInstance()方法中,我们只需要返回SingletonHolder.INSTANCE即可。

使用

Singleton singleton1 = Singleton.getInstance();
Singleton singleton2 = Singleton.getInstance();
System.out.println(singleton1 == singleton2); // true

2. 枚举单例模式

枚举单例模式是一种非常简单、安全、高效的单例模式实现方式。在枚举类中,只有一个枚举项,因此可以保证单例对象的唯一性;同时,枚举类中的枚举项是在类加载的时候被初始化的,因此可以保证线程安全。

实现

public enum Singleton {
    INSTANCE;

    public void doSomething() {
        // ...
    }
}

上面的代码中,我们定义了一个枚举类型Singleton,其中只有一个枚举项INSTANCE。在INSTANCE中,我们可以定义一些方法和属性,用于实现单例对象的功能。

使用

Singleton.INSTANCE.doSomething();

3. 双重校验锁单例模式

双重校验锁单例模式是一种较为复杂的单例模式实现方式,它既保证了线程安全,又实现了懒加载。在实现时,需要注意一些细节,例如使用volatile关键字保证变量的可见性等。

原理

双重校验锁单例模式的原理是:在getInstance()方法中,先检查实例是否已经被创建,如果没有,则对实例进行加锁,并再次检查实例是否已经被创建。这样可以保证线程安全和懒加载。

实现

public class Singleton {
    private static volatile Singleton INSTANCE = null;

    private Singleton() {}

    public static Singleton getInstance() {
        if (INSTANCE == null) {
            synchronized (Singleton.class) {
                if (INSTANCE == null) {
                    INSTANCE = new Singleton();
                }
            }
        }
        return INSTANCE;
    }
}

上面的代码中,我们同样将Singleton类的构造函数定义成私有的,禁止外部创建实例。静态变量INSTANCE被定义成volatile和static,保证了线程安全和唯一性。在getInstance()方法中,我们使用了双重检查锁定的方法,确保只有一个线程能够创建实例。

使用

Singleton singleton1 = Singleton.getInstance();
Singleton singleton2 = Singleton.getInstance();
System.out.println(singleton1 == singleton2); // true

4.饿汉式

饿汉式是指在类加载的时候就创建唯一的实例,因此也称为饿汉式单例模式。

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

    private Singleton() {}

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

上面的代码中,我们将Singleton类的构造函数定义成私有的,禁止外部创建实例。在类加载的时候,静态变量INSTANCE会被初始化,此时唯一的实例就被创建出来了。通过静态方法getInstance(),我们可以获取该唯一实例。

5.懒汉式

懒汉式是指在需要的时候才创建唯一的实例,因此也称为懒汉式单例模式。

public class Singleton {
    private static volatile Singleton INSTANCE = null;

    private Singleton() {}

    public static Singleton getInstance() {
        if (INSTANCE == null) {
            synchronized (Singleton.class) {
                if (INSTANCE == null) {
                    INSTANCE = new Singleton();
                }
            }
        }
        return INSTANCE;
    }
}

上面的代码中,我们同样将Singleton类的构造函数定义成私有的,禁止外部创建实例。静态变量INSTANCE被定义成volatile和static,保证了线程安全和唯一性。在getInstance()方法中,我们使用了双重检查锁定的方法,确保只有一个线程能够创建实例。

总结

总的来说,单例设计模式在实际开发中非常常用,它可以确保系统中某些类只有一个实例,从而节省了系统资源,加快了系统的运行速度。

在实现单例模式时,我们通常需要考虑线程安全、懒加载等问题。常见的单例模式包括饿汉式、懒汉式、静态内部类、枚举、双重校验锁等几种。它们各有优缺点,具体使用时需要根据实际情况选择。

在实际开发中,我们可以将单例模式应用于数据库连接池、线程池、日志记录器等系统中,能够提高系统的性能和稳定性。同时,我们也需要注意单例模式的使用场景和限制,避免滥用单例模式导致系统设计不合理。

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: java 单例 设计模式
最后更新:2023年 5月 6日

墨风如雪

一个热爱生活,热爱分享的程序员

打赏 点赞
下一篇 >

文章评论

您需要 登录 之后才可以评论

墨风如雪

一个热爱生活,热爱分享的程序员

最新 热点 随机
最新 热点 随机
告别机械感!OpenAudio S1让AI声音活起来 Sora触手可及!微软必应AI视频生成器,全民创作时代来临? 阿里WebAgent开源:引领自主搜索新纪元 重磅炸弹!字节跳动开源BAGEL:70亿参数,统一多模态理解与生成,AI“全能王”诞生记! 小米MiMo-VL:7B参数,怎么就成了多模态界的“越级打怪王”? 炸裂!DeepSeek 8B 量化版降临:告别显存焦虑,你的 3080 Ti 也能玩转顶级大模型了!
炸裂!微软这门免费AI Agent新手课,GitHub近2万星,简直是宝藏!ComfyUI“打通任督二脉”:直接调用Veo2、GPT-4o等65大模型!一键串联你的AI工作流AI圈炸锅了!Mistral Medium 3:性能 SOTA,成本打骨折,企业玩家的新宠?字节终于开源“扣子”同款引擎了!FlowGram:AI 时代的可视化工作流利器告别“微信黑箱”!Chatlog:让你的聊天记录也能拥有“AI大脑”!字节跳动 Seed-Coder-8B:不靠人工洗数据,这80亿参数的小模型如何写出顶尖代码?
炸裂!DeepSeek 8B 量化版降临:告别显存焦虑,你的 3080 Ti 也能玩转顶级大模型了! NGINX配置文件详解 告别码农式炼丹!阿里云百炼这波MCP服务,让AI Agent开发像搭积木一样简单? 一键BBRplus加速脚本 从零开始,详细讲解如何在服务器上安装、配置和使用宝塔面板:一站式解决网站管理问题 Java CAS原理详解
标签聚合
教程 设计模式 java 动态规划 spring 算法 AI deepseek

COPYRIGHT © 2023 墨风如雪博客. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

免责声明 - 隐私政策