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

游戏落地页网站建设技术先进的网站建

游戏落地页网站建设,技术先进的网站建,成立一个网站平台要多少钱,个人建站公司介绍 单例模式#xff08;Singleton#xff09;保证一个类仅有一个实例#xff0c;并提供一个访问它的全局访问点。 单例模式的结构图如下所示#xff1a; 使用单例模式的原因 对一些类来说#xff0c;只有一个实例是很重要的。如何才能保证一个类只有一个实例并且这个…介绍 单例模式Singleton保证一个类仅有一个实例并提供一个访问它的全局访问点。 单例模式的结构图如下所示 使用单例模式的原因 对一些类来说只有一个实例是很重要的。如何才能保证一个类只有一个实例并且这个实例易于被访问呢 基于程序员之间的约定或是利用全局变量吗 虽然这样或许也可以实现但是单例模式确是更好的做法。因为仅仅靠约定或是全局变量如果重新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();这种写法来创建它的实例这样写会报错如下所示 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(两个对象是相同的实例);}}比较两个对象看看它们是不是同一个实例运行结果如下所示 多线程下的单例模式 上述代码在多线程情况下会存在问题如果有多个线程同时访问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());}} }运行结果如下所示 两个对象的哈希码不同在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语句确保在任何时候最多只有一个线程执行其主体。 现在再来看看运行结果 双重锁定 现在两个对象的哈希码一样了在这里我们可以简单的认为是同一个实例了。 但是每次都要执行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就不为空第二个线程就无法创建新的实例了。 现在再来看看运行结果 静态初始化 其实在实际应用中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(); 在第一次引用类的任何成员时创建实例公共语言运行时负责处理变量初始化。 现在再来看看运行结果 由于这种静态初始化的方式是在自己被加载时就将自己实例化所以被形象地称之为饿汉单例类原先的单例模式的处理方式是要在第一次被引用时才会将自己实例化所以就被称为懒汉单例类。 总结 本文介绍了在C#中如何使用单例模式并介绍了在多线程模式下单例模式可能存在的问题及其解决方法希望对你有所帮助。 参考 1、《Head First 设计模式中文版》 2、《大话设计模式》 3、《设计模式可复用面向对象软件的基础》
http://www.hkea.cn/news/14316291/

相关文章:

  • 五大免费资源网站网站建设招标文件范本
  • 网站开发项目进度表科技 杭州 网站建设
  • 唐山做网站那家好wordpress 推荐
  • 网站seo关键词排名推广页面模板在公号什么地方显示
  • 北京私人做网站在wordpress教程
  • 网站设计O2O平台佛山总代理wordpress菜单登录
  • 上海服装品牌网站建设北京做手机网站的公司
  • 做汽车英文网站如何设置公司网站
  • 网站制作培训东莞市人才招聘网
  • 上海网站推一个网站如何推广
  • 网站开发项目报价备案个人可以做视频网站吗
  • 海沧建设网站多少哈尔滨网站建设推广方案
  • 天津快速建站模板丽水建设局网站
  • 网站建设与维护合同范本建设互联网站机房需要哪些设备
  • 最棒的网站建设北京软件公司招聘信息最新
  • 怎么样建设网站访问中国建设银行网站
  • 怎么做网站服务家庭装修设计平台
  • 网站中高端建设上海网站建设公司服务有哪些
  • 模版做网站多少钱wordpress多少钱
  • 网站开发如何dw中小手做网站做推广
  • 手机网站怎么推广礼品网站如何做
  • 网站建设致谢企业经营沙盘seo优化
  • 科技网站设计案例网站建站加盟
  • 商业网站地方频道360网址大全
  • 建设银行网上银行网站网站备案信息是什么意思
  • 电商平台网站建设方案短网站生成
  • 天津做网站制作公司游戏软件开发公司排名
  • 哪些网站做微课赚钱效果图网站哪个好
  • 学院网站建设的作用越秀网站建设价格
  • 东莞市公司网站建设品牌世界十大建筑设计事务所