




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一、引入单例模式作为23种设计模式中的最基础的一种模式,在平时开发中应用也非常普遍。到底哪些类应该设计成单例的呢,我们来举个最通俗的例子。在一个父容器中单击某个菜单项打开一个子窗口,如果不使用单例又没有作菜单项的可用控制的话,每次单击菜单项都会打开一个新窗口。这不仅会浪费内存资源,在程序逻辑上也是不可以接受的。二、最简单的单例下面来看一个最简单的单例模式的构造形式 public class Program private static void Main(string args) GetInstance(); Console.ReadLine(); private void GetInstance() Singleton objectSingleton = Singleton.getInstance(); public class Singleton private static Singleton instance = null; private Singleton() public static Singleton getInstance() if (instance = null) instance = new Singleton(); Console.WriteLine(Create a singleton instance!); return instance; 这里通过几个关键的地方以保证返回唯一的实例:1. 私有的构造器,防止客户端用new关键字去创建实例对象 2. 静态的instance对象,保证全局唯一性 3. 对外的公共的静态实例方法,从类级别直接可调用此方法 4. 通过判断null值,决定是创建新实例还是直接返回。 三、并发下的单例不过,以上标准的单例构造模式在多并发的情况下就有可能失效,请参考下面的这种情况。 private static void Main(string args) /开启10个线程来模拟多并发的情况 for (int i = 0; i 10; i+) Thread thread = new Thread(new ThreadStart(GetInstance); thread.Start(); Console.ReadLine(); private static void GetInstance() Singleton objectSingleton = Singleton.getInstance(); public class Singleton private static Singleton instance = null; private Singleton() public static Singleton getInstance() /让线程睡一会,来模拟有多个进程都已经在调用getInstance方法 Thread.Sleep(10); if (instance = null) instance = new Singleton(); Console.WriteLine(Create a singleton instance!); return instance; 以上的程序中开启了10个线程,来模拟多个用户同时访问getInstance方法。在getInstance方法里,开始先让线程睡一会,以模拟多个线程都已经进入了该方法。从运行的结果看上,基本上不能保证实例化唯一的实例了。产生这种问题的原因就是,当一个线程进入getInstance 方法,通过了 instance=null 的条件,还没有来的及执行 instance = new Singleton() 时,另一个线程也通过了条件判断,这时就会 new Singleton() 多次了。解决的办法就是加锁,只让一个线程进来,参考以下代码: public class Program private static void Main(string args) /开启100个线程来模拟多并发的情况 for (int i = 0; i 100; i+) Thread thread = new Thread(new ThreadStart(GetInstance); thread.Start(); Console.ReadLine(); private static void GetInstance() Singleton objectSingleton = Singleton.getInstance(); public class Singleton private static Singleton instance = null; private static readonly object objForLock=new object(); private Singleton() public static Singleton getInstance() /让线程睡一会,来模拟有多个进程都已经在调用getInstance方法 Thread.Sleep(10); /加一道锁只让一个线程进来 lock (objForLock) if (instance = null) instance = new Singleton(); Console.WriteLine(Create a singleton instance!); return instance; 这样差不多可以达到我们的要求,只有一个实例对象存在可以保证了,但是这样会带来一点性能问题。如果每个线程进入getInstance方法后,都要lock一下以进行线程同步的话,每个线程到这里都要等待解锁后才能进入,但是如果 instance已经不是null了,那就应该直接返回而不是等待解锁,所以这里需要引入“双重锁”的单例构造方法,代码如下: private static void Main(string args) /开启100个线程来模拟多并发的情况 for (int i = 0; i 100; i+) Thread thread = new Thread(new ThreadStart(GetInstance); thread.Start(); Console.ReadLine(); private static void GetInstance() Singleton objectSingleton = Singleton.getInstance(); public class Singleton private static Singleton instance = null; private static readonly object objForLock=new object(); private Singleton() public static Singleton getInstance() /让线程睡一会,来模拟有多个进程都已经在调用getInstance方法 Thread.Sleep(10); /先判断是不是已经实例化过了,避免进入锁等待状态 if(instance =null) /加一道锁只让一个线程进来 lock (objForLock) if (instance = null) instance = new Singleton(); Console.WriteLine(Create a singleton instance!); return instance; 四、“懒汉式”单例与“饿汉式”单例的比较所谓的“懒汉式”与“饿汉式”,就是实例对象的初始化时间不同:1.在需要实例化的时候才进行实例化,就是懒汉式。我们上面的这些例子都是懒汉式的。懒汉式有好处当然是节省资源啦,需要的时候才去构造,平时不用占用内存。不过,这会带来上面提到的在多并发下需要加锁限制访问的问题。2.类加载时就直接进行实例化,就是饿汉式。例如下面的代码: private static Singleton instance = new Singleton(); private Singleton() public static Singleton getInstance() return instance; 饿汉式单例是当类第一次被加载时就会将instance进行实例
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度智能社区O2O服务网络共建合作合同
- 2025年特色农产品全国冷链配送及溯源服务合同
- 2025年自然资源厅地质灾害防治与生态修复服务合同
- 2025年企业职工健康管理项目医疗服务合作协议
- 2025年新型电商产品定制开发合同:包括研发、设计、测试及售后服务保障
- 2025年ERP系统销售与跨行业应用拓展合作协议
- 2025年定制化PVC耐压管材买卖合同示范文本
- 2025年国际医疗器械研发与生产合作合同
- 2025年信用卡额度抵押个人创业投资贷款服务合同
- 2025年跨境电商平台品牌授权代理合同正规范本
- 2025年公安机关人民警察招录面试专项练习含答案
- 医院护理管理课件
- 变电运维安全活动个人发言
- 2025年艾梅乙知识竞赛试题及答案
- 东北三省2025~2026学年度上学期东北三省精准教学高三联考 物理 强化卷(含答题卡、答案及解析)
- 大学营养与健康
- 进度质量考核管理办法
- 2025年宜宾市中考语文试题卷(含答案详解)
- 悬灸护理课件
- 肛肠科临床诊疗指南
- 自动化分选装置-洞察及研究
评论
0/150
提交评论