欢迎来到天天文库
浏览记录
ID:49499523
大小:255.50 KB
页数:21页
时间:2020-02-06
《C#设计模式之单件模式.ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、单件模式模式模式是一个非常有趣的话题,它是对特定前提下重复出现问题的一个普遍解答,它是一种思想,使用得当也会对设计、实施提供帮助。简单的说,软件开发发展了几十年,前人遇到了很多很多的问题,有些人做了归纳总结,把某一类问题总结出一个解决套路,这些套路可以有效的解决类似的问题。形成了我们的23种模式。概述Singleton模式要求一个类有且仅有一个实例,并且提供了一个全局的访问点。五种实现简单实现1publicsealed class Singleton 2{ 3 static Singleton instanc
2、e=null; 4 5 Singleton() 6 { 7 } 8 9 public static Singleton Instance10 {11 get12 {13 if (instance==null)14 {15 instance = new Singleton();16 }17 return instance
3、;18 }19 }20}简单实现简单实现很容易理解,只有在实例为空的情况下才创建新的实例。但若处在多线程情况下,会出现问题:1)线程一执行完if (instance==null)这句后,准备进入下一句创建实例时,被挂起;2)此时切换到线程二,线程二全部执行完毕后,实例已经创建完毕。3)线程一激活,继续创建实例,造成双实例情况。违背单间原则。安全的线程1publicsealed class Singleton 2{ 3 static Singleton instance=null;
4、4 static readonly object padlock = new object(); 5 6 Singleton() 7 { 8 } 910 public static Singleton Instance11 {12 get13 {14 lock (padlock)15 {16 if (instance==null)17
5、 {18 instance = new Singleton();19 }20 return instance;21 }22 }23 }24}安全的线程此设计更正了简单实现出现的情况,其不会出现双线程时创建多个实例。但是,进入Instance的Get方法后,直接被锁住,直到return结束后,才会允许其他线程进入。此处大大的降低了效率,因为其不管Instance是
6、否为空,都加锁,有点不合适。双重锁定1publicsealed class Singleton 2{ 3 static Singleton instance=null; 4 static readonly object padlock = new object(); 5 6 Singleton() 7 { 8 } 910 public static Singleton Instance11 {12 get13 {14
7、 if (instance==null)15 {16 lock (padlock)17 {18 if (instance==null)19 {20 instance = new Singleton();21 }22 }2
8、3 }24 return instance;25 }26 }27}双重锁定双重锁定改善了安全的线程出现的性能降低的问题。如若Instance不为空,则不需要进入锁,提高了效率。有人会问为什么锁外面判断一次实例是否为空,锁里面还有一次判断?主要是考虑多线程,一个
此文档下载收益归作者所有