C#调用instance()试图

学习C#语言时,经常会遇到C#调用instance()试图问题,这里将介绍C#调用instance()试图问题的解决方法。

首先去C#调用instance()试图获得类的实例,instance()成员方法判断该类没有创建***实例,于是开始创建实例。由于一些因素,主线程不能马上创建成功,而需要等待一些时间。此时线程1也去调用instance()试图获得该类的实例,因为此时实例还未被主线程成功创建,因此线程1又开始创建新实例。结果是两个线程分别创建了两次实例,对于计数器类来说,就会导致计数的值被重置,与Singleton的初衷违背。解决这个问题的办法是同步。

下面看看本文的计数器的例子的实现:

使用方法一:

 
 
 
  1. using System;  
  2. using System.Threading;  
  3. namespace csPattern.Singleton  
  4. {  
  5. public class Counter  
  6. {  
  7. static Counter uniCounter = new Counter(); //存储***的实例。  
  8. private int totNum = 0; //存储计数值。  
  9. private Counter()  
  10. {  
  11. Thread.Sleep(100); //这里假设因为某种因素而耽搁了100毫秒。  
  12. //在非lazy initialization 的情况下, 不会影响到计数。.  
  13. }  
  14. static public Counter instance()  
  15. {  
  16. return uniCounter;  
  17. }  
  18. public void Inc() { totNum ++;} //计数加1。  
  19. public int GetCounter() { return totNum;} //获得当前计数值。  
  20. }  
  21. }  

方法一中由于实例一开始就被创建,所以instance()方法无需再去判断是否已经存在***的实例,而返回该实例,所以不会出现计数器类多次实例化的问题。

使用方法二:

 
 
 
  1. using System;  
  2. using System.Threading;  
  3. using System.Runtime.CompilerServices;  
  4. namespace csPattern.Singleton  
  5. {  
  6. public class Counter_lazy  
  7. {  
  8. static Counter_lazy uniCounter;  
  9. private int totNum = 0;  
  10. private Counter_lazy()  
  11. {  
  12. Thread.Sleep(100); //假设多线程的时候因某种原因阻塞100毫秒  
  13. }  
  14. [MethodImpl(MethodImplOptions.Synchronized)] //方法的同步属性  
  15. static public Counter_lazy instance()  
  16. {  
  17. if (null == uniCounter)  
  18. {  
  19. uniCounter = new Counter_lazy();  
  20. }  
  21. return uniCounter;  
  22. }  
  23. public void Inc() { totNum ++;}  
  24. public int GetCounter() { return totNum;}  
  25. }  
  26. }  

不知道大家有没有注意到instance()方法上方的[MethodImpl(MethodImplOptions.Synchronized)] 语句,他就是同步的要点,他指定了instance()方法同时只能被一个线程使用,这样就避免了线程0调用instance()创建完成实例前线程1就来C#调用instance()试图获得该实例。

【编辑推荐】

  1. C#窗体里调用浅谈
  2. C#调用ListEmployee命令
  3. C# CreateEmployeeDefinition()函数
  4. C#实现断点续传详细剖析
  5. C# Employee对象浅谈

分享标题:C#调用instance()试图
当前网址:http://www.shufengxianlan.com/qtweb/news14/337014.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联