首页 > 其他分享 >单例模式之延迟加载和初始加载

单例模式之延迟加载和初始加载

时间:2024-07-05 11:41:18浏览次数:6  
标签:Lazy Console Singleton 线程 单例 加载 延迟

一、什么是初始加载?

实现单例模式有两种方式,一种是懒加载,也就是延迟加载,当首次调用时创建单例对象,另一种是初始加载,在应用程序启动时就初始化单例对象,并将其保存在内存中以备将来使用,而不是需要时才创建。初始加载不需要考虑多线程环境导致的线程不安全问题,因为CLR将负责对象初始化和线程安全。这意味着我们不需要显式地编写任何代码来处理多线程环境的线程安全性。如下:

public sealed class Singleton
{
    private static int counter = 0;
    private static readonly Singleton singleInstance = new Singleton(); 
    private Singleton()
    {
        counter++;
        Console.WriteLine("Counter Value " + counter.ToString());
    }
    
    public static Singleton GetInstance
    {
        get
        {
            return singleInstance;
        }
    }
    public void PrintDetails(string message)
    {
        Console.WriteLine(message);
    }
}

定义私有静态常量singleInstance,并实例化Singleton对象赋值给该常量,由于是静态的,所以在应用启动就会创建,并加载到内存中,可以随时调用。主要由CLR在内部负责变量的初始化以及即时加载中的线程安全。

二、什么是延迟加载?

定义私有静态常量,但是并不实例化赋值,而是等到首次调用时再创建实例,往后每次调用就用这一个实例。也就是将对象的初始化延迟到需要它的时候。当创建对象的成本非常高以及很少使用该对象时,需要使用延迟加载。如果使用得当,延迟加载可以提高应用程序的性能。在C#中可以使用Lazy关键字使单例实例延迟加载。

三、理解C#中的Lazy关键字

Lazy是在.NET Framework 4.0引入的,提供对延迟初始化的支持。使用方式如下:

private static readonly Lazy<Singleton> Instancelock = new Lazy<Singleton>(() => new Singleton());

非常重要的一点是: Lazy<T> 对象在默认情况下是线程安全的。在多线程环境中,当多个线程试图同时访问相同的 GetInstance 属性时,Lazy将负责线程安全。代码如下:

public sealed class Singleton
{
    private static int counter = 0;
    private static readonly Lazy<Singleton> Instancelock 
        = new Lazy<Singleton>(() => new Singleton());

    private Singleton()
    {
        counter++;
        Console.WriteLine("Counter Value " + counter.ToString());
    }
    public static Singleton GetInstance
    {
        get
        {
            return Instancelock.Value;
        }
    }
    public void PrintDetails(string message)
    {
        Console.WriteLine(message);
    }
}

最后输出的结果和初始加载运行输出的结果是相同的,这是因为Lazy关键字只创建一个单例实例,而且它们在默认情况下是线程安全的。

 

C#之Lazy<T>

Lazy<T>主要用在单例模式,是一种延迟加载(Lazy Loading)的机制,它允许您推迟对象的创建直到第一次访问该对象。这种方式在需要时才分配资源,能够提高性能和资源利用率。Lazy类提供了一个简单且线程安全的方法来实现延迟加载。以下是Lazy的一些主要特点和用法:
延迟加载:Lazy允许您将对象的创建推迟到第一次访问该对象的时候,而不是在对象被创建时就立即分配资源。

线程安全:Lazy在多线程环境下是线程安全的,它会确保只有一个线程创建对象,其他线程在对象创建完成之前会被阻塞。

性能优化:Lazy的延迟加载机制能够在应用程序启动时节省资源,只有在需要时才会执行实际的对象创建过程。

异常处理:如果对象的创建过程中发生了异常,Lazy会捕获并将异常包装在后续访问对象时抛出。

支持初始化:Lazy提供了多种构造函数,允许您传入一个委托来初始化对象,或者指定延迟加载的行为。

int count = 0;
Lazy<string> lazyStr = new Lazy<string>(() =>
{
    Console.WriteLine("Lasy Loading...Only once,Only needed!");
    count += 1;
    return "Hello,LasyStr";
});
Console.WriteLine($"Try to fetch lasyStr:{lazyStr.Value}");
Console.WriteLine($"Try to fetch lasyStr again:{lazyStr.Value}");
Console.WriteLine($"Try to fetch lasyStr again:{lazyStr.Value}");
Console.WriteLine($"now,count is {count}");

 

标签:Lazy,Console,Singleton,线程,单例,加载,延迟
From: https://www.cnblogs.com/ILoveJackSparrow/p/18285527

相关文章

  • UWA学堂上新|MMO游戏创建加载游戏角色对应服务器数据存储和读取
    课程是《基于.NetCore开发MMORPG分布式游戏服务器》系列课程第5节,课程旨在帮助大家从零开始搭建商业化MMORPG的分布式服务器框架,包括不同种类服务器的线程模型,如中心服务器、网关服务器、游戏服务器、寻路服务器等,并讲解了这些服务器该如何根据各自的职责进行业务模块分工。 ......
  • 海康VM应用FAQ 1.2 全局脚本--方案加载后自动执行某流程
    【需求描述】VM方案加载成功后,自动执行某个流程。【应用场景】每次上电打开软件后,告知上位机软件准备就绪的信号;监控VM软件的运行状态,判断软件是否有奔溃,即Vm方案加载后连续运行某一流程,与上位机进行交互(与通信的心跳管理类似,不同的是通信的心跳只能监控通信是否断开,且仅为......
  • 从 URL 到页面:浏览器加载过程的详细解析
    当你在浏览器中输入一个URL并按下回车键,直到页面内容显示在屏幕上,这个过程中发生了许多步骤。以下是一个详细的分解,解释从输入URL到看到内容之间的整个过程:1.用户输入URL用户在浏览器地址栏中输入URL(例如 https://www.example.com)并按下回车键。2.浏览器解析URL浏......
  • 使用 Tampermonkey 在页面加载完5秒后监听特定页面元素的点击事件并修改 API 返回的数
    示例 //==UserScript==//@nameNewUserscript//@namespacehttp://tampermonkey.net///@version2024-07-04//@descriptiontrytotakeovertheworld!//@authorYou//@matchhttps://a.x.com/*//@iconhttps://www.......
  • Dungeonborne联机失败、延迟高、卡顿的解决方法
    Dungeonborne将第一人称动作的即时性与经典的西幻RPG职业设计巧妙融合,为玩家带来了一场前所未有的游戏体验。在这款沉浸式第一人称PvPvE地下城探险游戏中,我们可以独自深入探索,也可以与值得信赖的伙伴并肩作战,共同揭开地下城的神秘面纱,寻找那些被岁月掩埋的宝藏。目前Dungeonbor......
  • 绝区零延迟高?教你快速降低绝区零延迟
    作为一款全新3D动作游戏,《绝区零》的战斗体验可谓一骑绝尘。你可以自由组建属于自己的三人小队,通过精确的操控和默契的配合,对敌人展开猛烈的攻击。而巧妙的闪避和精准的格挡,更是能让你在敌人的狂风暴雨中屹立不倒。当敌人陷入失衡的瞬间,你将有机会释放出华丽绝伦的连携技,将敌人......
  • 【设计模式(三)】创建型模式--单例模式
    创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是“将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。饿汉式类加载就会导致该单实例对象被创建/***饿汉式*静态变量创建类的对象*/publicclassSingleton{//......
  • 通过arcgis of Js 4.x 加载 高德地图
    关于如何加载高德地图,目前在网上找到的切片图片加载的高德地图主要是参考官方demo上的CustomTileLayer然后修改进行使用的具体代码如下:<!DOCTYPEhtml><html><head><metacharset="utf-8"><metaname="viewport"content="initial-scale=1,maximum-scale=1,u......
  • 实现返利App中的数据缓存与预加载机制
    实现返利App中的数据缓存与预加载机制大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!数据缓存是指将经常访问的数据临时存储在高速存储器中,以提高数据访问速度和系统性能。在返利App中,数据缓存和预加载机制能......
  • C++单例模式、工厂模式、观察者模式等的实现和应用场景。
    设计模式是软件开发中常用的解决方案,它们提供了一些经过验证的方法来解决常见的设计问题。以下是单例模式、工厂模式和观察者模式在C++中的实现和应用场景的详细讲解。1.单例模式(SingletonPattern)概念单例模式确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。......