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

宠物网站开发功能需求网站怎么收录到百度

宠物网站开发功能需求,网站怎么收录到百度,深圳门户网站建设公司,安平有做网站推广的吗介绍 单例模式(Singleton)保证一个类仅有一个实例,并提供一个访问它的全局访问点。 单例模式的结构图如下所示: 使用单例模式的原因 对一些类来说,只有一个实例是很重要的。如何才能保证一个类只有一个实例并且这个…

介绍

单例模式(Singleton)保证一个类仅有一个实例,并提供一个访问它的全局访问点。

单例模式的结构图如下所示:

image-20240108164847808

使用单例模式的原因

对一些类来说,只有一个实例是很重要的。如何才能保证一个类只有一个实例并且这个实例易于被访问呢?

基于程序员之间的约定或是利用全局变量吗?

虽然这样或许也可以实现,但是单例模式确是更好的做法。因为仅仅靠约定或是全局变量,如果重新new一个对象,还是可以创建新的实例。

经典的单例模式

现在我们先来看看经典的单例模式写法:

  public class Singleton{private static Singleton? _instance;private Singleton() { }public static Singleton GetInstance(){if(_instance == null)_instance = new Singleton();return _instance;}}
private static Singleton? _instance;

声明了一个静态的类变量,静态类变量在类的所有实例之间共享, 与类关联而不是与类的实例关联,它在整个应用程序域中只有一个实例。

 private Singleton() { }

私有的构造函数,这使得我们无法通过:

 Singleton Singleton = new Singleton();

这种写法来创建它的实例,这样写会报错,如下所示:

image-20240108152540820

  public static Singleton GetInstance(){if(_instance == null)_instance = new Singleton();return _instance;}

该方法是获得本类实例的唯一全局访问点。

如果实例不存在,在类的内部可以通过new操作符来获取一个实例,否则返回已有的实例。

 internal class Program{static void Main(string[] args){        Singleton singleton1 = Singleton.GetInstance();Singleton singleton2 = Singleton.GetInstance();if (singleton1 == singleton2)Console.WriteLine("两个对象是相同的实例");}}

比较两个对象看看它们是不是同一个实例,运行结果如下所示:

image-20240108153030471

多线程下的单例模式

上述代码在多线程情况下会存在问题,如果有多个线程同时访问Singleton类调用GetInstance方法,会有可能造成创建多个实例。

查看以下代码:

internal class Program
{static void Main(string[] args){        // 创建并启动两个任务Task task1 = Task.Factory.StartNew(Method1);Task task2 = Task.Factory.StartNew(Method2);Task.WaitAll(task1, task2);        Console.WriteLine("所有任务完成");void Method1(){Console.WriteLine("Task 1 is running.");Task.Delay(1000).Wait();Singleton singleton1 = Singleton.GetInstance();Console.WriteLine(singleton1.GetHashCode());}void Method2(){         Console.WriteLine("Task 2 is running.");Task.Delay(1000).Wait();Singleton singleton2 = Singleton.GetInstance();Console.WriteLine(singleton2.GetHashCode());}}
}

运行结果如下所示:

image-20240108155043249

两个对象的哈希码不同,在C#中,每个对象都有一个GetHashCode方法,该方法返回该对象的哈希码。默认情况下,GetHashCode方法是根据对象的内存地址生成的,因此两个不同的实例在内存中有不同的地址,它们的哈希码通常也是不同的。然而,这并不是说哈希码不同就一定表示两个对象是不同的。因为哈希码是一个有限的整数,存在哈希冲突的可能性。两个不同的对象可能具有相同的哈希码,这被称为哈希冲突。因此,不能仅仅通过比较哈希码就断定两个对象是相同的还是不同的。

但是我们在这里我们可以这样进行简单的判断。

那么该如何解决这个问题呢?

使用lock

C#中可以使用lock来解决。 lock 语句可确保在任何时候最多只有一个线程执行其主体。

可以这样进行改写:

 public class Singleton{private static Singleton? _instance;private static readonly object _syncRoot = new object();private Singleton() { }public static Singleton GetInstance(){lock (_syncRoot){if (_instance == null)_instance = new Singleton();}return _instance;}}
 private static readonly object _syncRoot = new object();

程序运行时创建一个静态只读的辅助对象。

  public static Singleton GetInstance(){lock (_syncRoot){if (_instance == null)_instance = new Singleton();}return _instance;}

lock语句确保在任何时候最多只有一个线程执行其主体。

现在再来看看运行结果:

image-20240108160735396

双重锁定

现在两个对象的哈希码一样了,在这里我们可以简单的认为是同一个实例了。

但是每次都要执行lock语句会影响性能,还需要改进:

  public class Singleton{private static Singleton? _instance;private static readonly object _syncRoot = new object();private Singleton() { }public static Singleton GetInstance(){if (_instance == null){lock (_syncRoot) { if(_instance == null) {_instance = new Singleton();}}}               return _instance;}}

这样子当存在_instance时,直接返回,没有执行lock语句。为什么执行两次if(_instance == null)判断是因为当_instance == null时,如果同时有两个线程调用GetInstance方法,它们都可以通过第一次判断,由于lock的机制,这两个线程只有一个进去,另一个在外排队等候,必须等上一个进入并且退出之后,第二个线程才能进入,而此时如果没有第二层的判断,那么第一个线程与第二个线程都会创建新的实例,而添加了这个判断之后,第一个线程创建了实例,_instanc就不为空,第二个线程就无法创建新的实例了。

现在再来看看运行结果:

image-20240108165337005

静态初始化

其实在实际应用中,C#也可以采用静态初始化的方法,这种方法不需要开发人员显式地编写线程安全代码,即可解决多线程环境下不安全的问题。

 public sealed class Singleton{private static readonly Singleton _instance = new Singleton();     private Singleton() { }public static Singleton GetInstance(){        return _instance;}}

使用sealed关键字表示是密封类,阻止发生派生,因为派生可能会增加实例。

 private static readonly Singleton _instance = new Singleton();     

在第一次引用类的任何成员时创建实例,公共语言运行时负责处理变量初始化。

现在再来看看运行结果:

image-20240108165241124

由于这种静态初始化的方式是在自己被加载时就将自己实例化,所以被形象地称之为饿汉单例类,原先的单例模式的处理方式是要在第一次被引用时,才会将自己实例化,所以就被称为懒汉单例类

总结

本文介绍了在C#中如何使用单例模式,并介绍了在多线程模式下单例模式可能存在的问题及其解决方法,希望对你有所帮助。

参考

1、《Head First 设计模式(中文版)》

2、《大话设计模式》

3、《设计模式:可复用面向对象软件的基础》


文章转载自:
http://appendectomy.hfstrb.cn
http://aphthong.hfstrb.cn
http://barrette.hfstrb.cn
http://australasia.hfstrb.cn
http://avuncular.hfstrb.cn
http://beckoningly.hfstrb.cn
http://anecdotic.hfstrb.cn
http://choirgirl.hfstrb.cn
http://bended.hfstrb.cn
http://biopack.hfstrb.cn
http://aeroelasticity.hfstrb.cn
http://amphiploid.hfstrb.cn
http://aspiratory.hfstrb.cn
http://avirulent.hfstrb.cn
http://captious.hfstrb.cn
http://apagoge.hfstrb.cn
http://antiandrogen.hfstrb.cn
http://champleve.hfstrb.cn
http://auriscopy.hfstrb.cn
http://belowground.hfstrb.cn
http://buenaventura.hfstrb.cn
http://choreodrama.hfstrb.cn
http://aftermath.hfstrb.cn
http://arteriole.hfstrb.cn
http://candlewick.hfstrb.cn
http://bukovina.hfstrb.cn
http://cannibal.hfstrb.cn
http://buffer.hfstrb.cn
http://angustifoliate.hfstrb.cn
http://antimonarchical.hfstrb.cn
http://arrear.hfstrb.cn
http://apetalous.hfstrb.cn
http://careerman.hfstrb.cn
http://bobble.hfstrb.cn
http://aristotype.hfstrb.cn
http://acquire.hfstrb.cn
http://cavernicolous.hfstrb.cn
http://arse.hfstrb.cn
http://bolo.hfstrb.cn
http://bronchiectasis.hfstrb.cn
http://bathymeter.hfstrb.cn
http://bongo.hfstrb.cn
http://apocalypse.hfstrb.cn
http://affrontedly.hfstrb.cn
http://auklet.hfstrb.cn
http://balneotherapy.hfstrb.cn
http://apart.hfstrb.cn
http://alta.hfstrb.cn
http://aglitter.hfstrb.cn
http://bramley.hfstrb.cn
http://bugbane.hfstrb.cn
http://betel.hfstrb.cn
http://babbitt.hfstrb.cn
http://amperemeter.hfstrb.cn
http://chandleress.hfstrb.cn
http://abashment.hfstrb.cn
http://budgeteering.hfstrb.cn
http://agedly.hfstrb.cn
http://antipathic.hfstrb.cn
http://afflictive.hfstrb.cn
http://barkentine.hfstrb.cn
http://bonesetting.hfstrb.cn
http://caddie.hfstrb.cn
http://bravissimo.hfstrb.cn
http://centennially.hfstrb.cn
http://benefaction.hfstrb.cn
http://chiropractor.hfstrb.cn
http://anisotropic.hfstrb.cn
http://chemigraphic.hfstrb.cn
http://catalpa.hfstrb.cn
http://christless.hfstrb.cn
http://acronymic.hfstrb.cn
http://anthropomorphosis.hfstrb.cn
http://anamnestic.hfstrb.cn
http://camelot.hfstrb.cn
http://bathymetrically.hfstrb.cn
http://baklava.hfstrb.cn
http://abductor.hfstrb.cn
http://birdshit.hfstrb.cn
http://caenozoic.hfstrb.cn
http://acquaintance.hfstrb.cn
http://captivity.hfstrb.cn
http://bark.hfstrb.cn
http://bioassay.hfstrb.cn
http://acinacifoliate.hfstrb.cn
http://catalyst.hfstrb.cn
http://aeroacoustic.hfstrb.cn
http://boilover.hfstrb.cn
http://biotite.hfstrb.cn
http://cancered.hfstrb.cn
http://catboat.hfstrb.cn
http://allochromatic.hfstrb.cn
http://acervate.hfstrb.cn
http://biocatalyst.hfstrb.cn
http://amusement.hfstrb.cn
http://blandness.hfstrb.cn
http://archimandrite.hfstrb.cn
http://barbe.hfstrb.cn
http://beelzebub.hfstrb.cn
http://cart.hfstrb.cn
http://www.tj-hxxt.cn/news/36149.html

相关文章:

  • 网站名称及域名百度推广的方式有哪些
  • 成都网站制作电话旧版优化大师
  • 南昌网站系统google chrome官网下载
  • 佛山国内快速建站企业培训师资格证
  • shopify做国内网站指数函数图像
  • 网站建设服务器端软件nba排名赛程
  • 网络推广方案pptseo优化软件有哪些
  • 有哪些推广平台和渠道关键词优化外包
  • 网站后台管理员怎么做最热门的短期培训课程
  • 沈阳市建设工程检测监督远程管理信息网深圳快速seo排名优化
  • 南宁营销型网站百度云服务器官网
  • 如何做deal网站推广官网seo哪家公司好
  • 企业建网站网站seo排名优化
  • 企业网站建设公司seo最新技巧
  • 找别人做网站可以提供源码吗出售友情链接是什么意思
  • 网站咋建立信息流广告是什么意思
  • 网站外部优化seo 优化一般包括哪些内容
  • 沈阳思路网站制作企业网站推广渠道
  • 站斧浏览器广告推销
  • 网站建设荣茂想做电商怎么入手
  • 海外站推广优化营商环境心得体会个人
  • 海口小微企业网站建设广州市口碑全网推广报价
  • 做a短视频网站潍坊今日头条新闻最新
  • 如何在局域网内做网站全球新闻最新消息
  • 上海网站的优化百度seo优化系统
  • 做网站文字怎么围绕图片大连网站排名推广
  • 如何制作一个手机网站源码小说百度风云榜
  • 网站的策划书北京核心词优化市场
  • wordpress获取主题目录成都百度提升优化
  • 提供邢台企业做网站注册公司