查看: 1210|回复: 3
打印 上一主题 下一主题

[其他] C#调用instance()

[复制链接]

2317

主题

54

听众

2万

积分

资深设计师

Rank: 7Rank: 7Rank: 7

纳金币
20645
精华
62

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2014-7-26 17:49:57 |只看该作者 |倒序浏览
来自网络转载:

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

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

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

使用方法一:

  • using System;  
  • using System.Threading;  
  • namespace csPattern.Singleton  
  • {  
  • public class Counter  
  • {  
  • static Counter uniCounter = new Counter(); //存储唯一的实例。  
  • private int totNum = 0; //存储计数值。  
  • private Counter()  
  • {  
  • Thread.Sleep(100); //这里假设因为某种因素而耽搁了100毫秒。  
  • //在非lazy initialization 的情况下, 不会影响到计数。.  
  • }  
  • static public Counter instance()  
  • {  
  • return uniCounter;  
  • }  
  • public void Inc() { totNum ++;} //计数加1。  
  • public int GetCounter() { return totNum;} //获得当前计数值。  
  • }  
  • }  

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

使用方法二:

  • using System;  
  • using System.Threading;  
  • using System.Runtime.CompilerServices;  
  • namespace csPattern.Singleton  
  • {  
  • public class Counter_lazy  
  • {  
  • static Counter_lazy uniCounter;  
  • private int totNum = 0;  
  • private Counter_lazy()  
  • {  
  • Thread.Sleep(100); //假设多线程的时候因某种原因阻塞100毫秒  
  • }  
  • [MethodImpl(MethodImplOptions.Synchronized)] //方法的同步属性  
  • static public Counter_lazy instance()  
  • {  
  • if (null == uniCounter)  
  • {  
  • uniCounter = new Counter_lazy();  
  • }  
  • return uniCounter;  
  • }  
  • public void Inc() { totNum ++;}  
  • public int GetCounter() { return totNum;}  
  • }  
  • }  

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


分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

hyui    

1

主题

2

听众

6671

积分

高级设计师

Rank: 6Rank: 6

纳金币
2715
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

沙发
发表于 2014-7-26 19:09:28 |只看该作者
THnkx for share )
回复

使用道具 举报

16

主题

5

听众

4304

积分

中级设计师

Rank: 5Rank: 5

纳金币
1
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

板凳
发表于 2014-7-26 21:12:56 |只看该作者

THnkx for share ))
回复

使用道具 举报

1

主题

1

听众

133

积分

设计实习生

Rank: 2

纳金币
50
精华
0

最佳新人

地板
发表于 2014-7-28 09:36:20 |只看该作者
多线程哪, 很高深
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-12-1 01:37 , Processed in 0.528226 second(s), 27 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部