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

C#单例模式懒汉式与饿汉式

单例模式一般分为懒汉模式和饿汉模式,懒汉式单例在第一次引用时创建实例,不是在类加载时;饿汉式单例模式是一种在类加载时就创建实例的方式,因此也称为静态初始化。
在这里插入图片描述
单例模式实现的技巧时构造私有,向外提供静态实例。

懒汉式单例模式实现

public class Singleton
{
    private static Singleton instance = null;

    private Singleton() {}

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

线程安全的懒汉式

为了确保线程安全,在懒汉式的基础上添加锁。

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

    private Singleton() {}

    public static Singleton Instance
    {
        get
        {
            lock (padlock)
            {
                if (instance == null)
                {
                    instance = new Singleton();
                }
                return instance;
            }
        }
    }
}

使用Lazy实现懒汉式单例模式

使用 Lazy:线程安全,支持延迟初始化,简化代码。

public class Singleton
{
    private static readonly Lazy<Singleton> lazy =
        new Lazy<Singleton>(() => new Singleton());

    public static Singleton Instance { get { return lazy.Value; } }

    private Singleton() {}
}

饿汉式单例实现

public class Singleton
{
    // 在类加载时就创建实例
    private static readonly Singleton instance = new Singleton();

    // 私有构造函数,确保外部不能通过new创建实例
    private Singleton() {}

    // 提供一个全局访问点
    public static Singleton Instance
    {
        get
        {
            return instance;
        }
    }

    // 你可以在这个类中添加其他功能
}

在饿汉式单例实现中,类中的 instance 字段在类加载时就被初始化,因此在多线程环境下也是线程安全的。
构造函数是私有的,防止外部通过new关键字创建实例。
通过 Instance 属性提供了对单例实例的全局访问点。
饿汉式单例模式的优点是简单、线程安全,但缺点是可能在程序启动时就创建实例,可能会浪费一些资源,特别是在实例的创建和初始化过程较为复杂的情况下。选择使用饿汉式还是懒汉式(延迟初始化)取决于具体的需求和性能考虑。


http://www.kler.cn/news/135974.html

相关文章:

  • CentOS 8搭建WordPress
  • 原理Redis-ZipList
  • cp: can‘t stat ‘/usr/share/zoneinfo/Asia/Shanghai‘: No such file or directory
  • 【多线程 - 11、死锁】
  • 原理Redis-Dict字典
  • 【zabbix监控四】zabbix之监控tomcat服务报警
  • 【Java 进阶篇】Ajax 实现——JQuery 实现方式 `get` 与 `post`
  • Android studio run 手机或者模拟器安装失败,但是生成了debug.apk
  • golang[ssa callgraph] 获取调用图实战
  • Jmeter做接口测试
  • 【C++】基础语法(中)
  • Python顺序结构程序设计
  • c语言:矩阵交换
  • C/C++多级指针与多维数组
  • AIGC ChatGPT4对Gbase数据库进行总结
  • Python-----PyInstaller的简单使用
  • linux上交叉编译qt库
  • [内存泄漏][PyTorch](create_graph=True)
  • 【小爱学大数据】FlinkKafkaConsumer
  • 浅析RSA非对称加密算法
  • 「Verilog学习笔记」ROM的简单实现
  • 机器学习第10天:集成学习
  • Vue 2.0的源码目录设计
  • vue3 vue-router 笔记
  • C# static关键字详解
  • 【Java程序员面试专栏 算法训练篇】二叉树高频面试算法题
  • 10-19 HttpServletResponse
  • ComText让机器人有了情节记忆
  • Upwork 新手使用指南——如何快速在Upwork上接单
  • 基于Vue+SpringBoot的校园电商物流云平台开源项目