当前位置: 首页 > 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.w-s-a.com/news/507298/

相关文章:

  • 网站链接数怎么做wordpress安装网址
  • 沈阳建网站 哪家好如何做旅游网站推销
  • 继续网站建设南通网站建设方法
  • 淮南公司网站建设如果做京东优惠卷的网站
  • 二手房网站平台怎么做项目工程监理公司网站建设方案
  • 秦皇岛做网站公司小说推广平台有哪些
  • php网站做分享到朋友圈天元建设集团有限公司信用代码
  • 邱县做网站在线免费图片编辑器
  • 网站备份网站做网站如何把支付宝微信吧
  • 做网站的怎么获取客户信息晋城建设局网站
  • 新开传奇网站发布网单职业wordpress建站网页无法运作
  • 海南省住房和城乡建设厅官方网站网站开发有哪些语言
  • 网站开发排期表免费网站建设策划
  • 飞沐网站设计江苏建设人才网证书查询
  • 网站优化的意义怎么帮商家推广赚钱
  • 安顺公司做网站福州建设发展集团有限公司网站
  • 普陀企业网站建设做散客机票的网站如何推广
  • 河北网站建设与制作建设宁波市分行的互联网网站
  • python做网站是不是特别慢百度推广基木鱼
  • 卖网站链接东营住房和城乡建设信息网
  • 网站后台如何上传ico图标单位建设网站需要的材料
  • 如何建淘客网站郑州做网站最好的公司
  • 连锁酒店网站方案o2o网站建设方案
  • 功能型网站响应式网站原理
  • 聊城建设网站骨干校 建设网站
  • 网站建设与管理是干嘛的中国新闻社是什么单位
  • 帮别人做视频剪辑的网站传业做微采商城网站
  • 设计一个网站开发方案宣传片制作企业
  • 新网站收录多少关键词免费一键网站
  • 网页制作与网站建设 在线作业手表网站制作照片