当前位置: 首页 > article >正文

【地铁上的设计模式】--创建型模式:单例模式(一)--懒汉式单例

从本篇文章开始,我们就进入到了单例模式,关于单例模式里的分支模式会在后续的文章中一一讲解

什么是单例模式

单例模式是一种创建型设计模式,它保证一个类只有一个实例,并提供了全局访问点。单例模式确保在系统中,该类只有唯一的一个实例存在,并提供了一个访问该实例的全局点,以便全局访问。单例模式常用于管理共享资源,例如线程池、缓存、日志对象等等,这些资源需要在整个应用程序中共享和访问。如果每次需要访问这些资源时都要创建一个新对象,不仅会影响程序性能,还会占用过多的系统资源。
单例模式可以通过以下几种方式来实现:

  1. 懒汉式单例:在需要时才创建单例对象,但是在多线程环境下需要使用同步来保证只有一个实例。
  2. 饿汉式单例:在类加载时就创建单例对象,但是可能会浪费资源。
  3. 双重检验锁单例:结合了懒汉式和饿汉式的优点,同时也需要使用同步来保证线程安全。
  4. 静态内部类单例:通过内部类的特性实现延迟加载和线程安全。
  5. 枚举单例:枚举类型保证了只有一个枚举常量,因此可以直接作为单例来使用,而且线程安全。

单例模式可以保证全局只有一个实例,避免了不必要的资源浪费和对象创建的额外开销。同时,单例模式也是一种常见的设计模式,开发人员应该在实际开发中合理应用。

如何实现懒汉式单例模式

懒汉式单例的实现步骤如下:

  1. 将构造函数设为私有,防止外部直接创建实例。
  2. 在类中定义一个私有的静态变量用于保存单例实例,初始值为 null。
  3. 提供一个公有的静态方法,返回类的唯一实例。在该方法中,如果实例为 null,就创建一个新的实例,并将其赋值给静态变量,否则直接返回现有实例。

Java实现

public class LazySingleton {
    private static LazySingleton instance = null;

    private LazySingleton() {
        // 私有构造函数
    }

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

在上面的代码中,getInstance() 方法是获取懒汉式单例实例的方法,使用 synchronized 关键字保证了线程安全。当第一个线程调用 getInstance() 方法时,会创建一个新的实例并将其赋值给 instance 变量,随后其他线程调用 getInstance() 方法时,直接返回已经创建的实例。这种实现方式简单易懂,但是在多线程环境下会存在性能问题。

C#实现

public class LazySingleton {
    private static LazySingleton instance = null;
    private static readonly object padlock = new object();

    private LazySingleton() {
        // 私有构造函数
    }

    public static LazySingleton GetInstance() {
        lock (padlock) {
            if (instance == null) {
                instance = new LazySingleton();
            }
            return instance;
        }
    }
}

在上面的代码中,GetInstance() 方法是获取懒汉式单例实例的方法,使用 lock 关键字保证了线程安全。当第一个线程调用 GetInstance() 方法时,会创建一个新的实例并将其赋值给 instance 变量,随后其他线程调用 GetInstance() 方法时,直接返回已经创建的实例。这种实现方式简单易懂,和Java实现一样,在多线程环境下会存在性能问题。

总结

懒汉式单例模式是一种常用的创建型设计模式,它能够确保一个类只有一个实例,并提供了一个全局访问点。这种模式的核心思想是在需要的时候才去创建实例,从而避免了不必要的资源浪费。懒汉式单例模式的实现相对简单,只需要将构造函数设为私有,定义一个私有的静态变量保存单例实例,提供一个公有的静态方法返回类的唯一实例即可。但是需要注意的是,在多线程环境下,需要加锁保证线程安全。懒汉式单例模式的缺点是性能问题,由于每次获取实例都需要进行线程同步,所以在高并发环境下可能会出现性能瓶颈。


http://www.kler.cn/a/14418.html

相关文章:

  • Redhat7源码ssh包编译为RPM包
  • 单表访问方法
  • libxml2交叉编译和移植
  • FPGA基础知识 LCMXO3LF-6900C-6BG400I FPGA可编程逻辑简介
  • 【Micropython】ESP8266通过NTP同步本地RTC时间
  • Android之 Bitmap使用
  • 022:Mapbox GL 加载geojson数据,形成热力图,自定义样式
  • Go语言面试题--进阶语法(32)
  • MySQL的binlog原理和它的几种使用方法
  • Echarts渲染行政区划,实现聚焦高亮交互
  • 写在AWE 2023前夕:华为全屋智能将重构家居智能化体验
  • 4.数据结构(0x3f:从周赛中学算法 2022下)
  • 太太太太太卷了,累了
  • SpringBoot常用注解说明
  • JavaSE 09 File 类 IO 流 - Part 03
  • 保姆级教程|昨晚撸了一个ChatGPT群聊机器人
  • C++智能指针unique_ptr
  • tp6 php 用chatgpt写的防爬技术
  • 高效办公——Excel表格-03篇(Excel常用快捷键 以及 Excel快捷键结合公式的各种常见的办公例子)
  • webwork详细攻略,在vue中使用和加载静态文件