C#调用instance()试图

开发 后端
这里介绍C#调用instance()试图,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对象浅谈
责任编辑:佚名 来源: 博客园
相关推荐

2009-08-17 16:18:47

C#调用CreateO

2009-08-04 09:30:33

C#调用ImageAn

2009-08-31 10:39:15

C#调用ListEmp

2009-08-31 18:05:14

C#调用WalkTre

2009-08-31 16:33:28

C#调用Dispose

2009-08-20 12:29:46

C#调用PInvoke

2009-08-03 13:13:52

C#调用Outlook

2009-08-25 15:26:03

C#调用ImOK

2009-08-05 15:10:19

C#调用GoogleE

2009-09-02 16:36:37

C#调用Excel对象

2009-08-25 10:59:00

C#调用函数显示值

2009-09-01 11:04:59

C#调用扩展方法

2009-08-07 17:19:50

C#调用外部进程

2009-08-07 16:43:44

C#调用Windows

2009-08-07 16:10:20

C#调用API

2009-08-07 17:22:36

C#调用dll导出函数

2009-07-31 16:12:10

Windows APIC#

2009-07-31 17:28:35

C#语言调用DLL

2009-08-03 12:57:27

C#调用DLL

2009-08-28 15:58:54

C#窗体里调用
点赞
收藏

51CTO技术栈公众号