版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
先来将Singleton写出来再说Singleton类namespace{publicclass{privatestaticSingletonsingleton;///new///</summary>privateSingleton(){}//////定义一个全局//////publicstaticSingleton{if(singleton==null){singleton=new}return}}}usingnamespace{class{staticvoidMain(string[]{Singleton.SingletonsingletonOne=Singleton.SingletonsingletonTwo
{}{
if ine("singletonOnesingletonTwoConsole.Wriine("singletonOne和singletonTwo代}}}}从上面的结果可以看出来,尽管我两次了GetInstance(),但是我的只是同一个实换句话来说,上面的代码中,由于构造函数被设置为private了,所以您无法再在Singleton类的外部使用newGetInstance()来Singleton类GetInstance()通过如下方式保证该Singleton首先这个Singleton类会在在第一次调用GetInstance()时创建一个实例,并将这个实例的封装在自身类中,然后以后调用GetInstance()时就会判断这个Singleton是否存在一个实例了,如果存必须通过GetInstance()来请求(注意是请求)首先,全局变量呢就是对一个对象的静态,全局变量确实可以提供单例模式实现的全局访Demo来做为说明,如果在一开始调用GetInstance()时,是由两个线程同时调用的(这种情况是很常见的),(或者是一个线程进入if判断语句后但还没有实例化Singletonsingleton还是为这样的话,两个线程均会进入GetInstance(),而后由于是第一次调用所以在Singleton中的静态变量singleton为null,这样的话,就会让两个线程均通过if语句的条件判断,然后调用newSingleton()publicstaticSingleton{if(singleton=={singleton=new}return}由于上面出现的问题中涉及到多个线程同时这个那么您可以先将一个线程锁定,然后等这个线程完成以后,再让其他的线程()中的if段语句,singleton!null的话,那么上面提到的问题是不会存在的,因为已经存在这个实所有的线程都无法进入if语句块,也就是所有的线程都无法调用语句newSingleton()了,但是如果此时的singleton==null的话,那么意味着这两个线程都是可以进入这个if语句块的,此时,我可以让一个线程先进入if语句块,然后我在外面对这个if语句块加锁,对第二个线程呢,由于if语句进行了加锁处理,所以这个进程就无法进入if语句块而处于阻当进入了if语句块的线程完成newSingleton()后,这个线程便会退出if语句块,此时,第二个线程就从阻塞状态中恢复,即就可以if语句块了,但是由于前面的那个线程已近创建了Singleton的实例,所以singletonnull,此时,第二个线程便无法通过if语句的判断条件了,即无法进入if语句块了,这样便保证了整个生命周期中只存在一个实例,也就是只有第一个线程创建了Singleton下面就来重新改进前面Demo中的Singleton类,使其在多线程的环境下也可以实现单例namespace{publicclass{privatestaticSingletonsingleton;privatestaticreadonlyobjectsyncObject=new///new///</summary>private{}//////定义一个全局//////publicstaticSingleton{singletonnullif(singleton==null){lock{singletonif(singleton=={singleton=new}}}return}}}上面的就是改进后的代码,可以看到在类中有定义了一个静态的只读对象这里需要说明的是,为何还要创建一个syncObject由于提供给lock关键字的参数必须为基于类型的对象,该对象用来定义锁的范围所以这个类型的对象总不能为null吧,而一开始的时候,singleton为null,所以是无所以必须要再创建一个对象即syncObject还有要解释一下的就是在GetInstance()中,我为什么要在ifsingleton==null这里涉及到一个名词Double-CheckLocking考虑这样一种情况,就是有两个线程同时到达,即同时调用此时由于singletonnull,所以很明显,两个线程都可以通过第一重的singletonnull,进入第一重if语句后,由于存在锁机制,所以会有一个线程进入lock语句并进入第二重singleton==null而另外的一个线程则会在lock语句的外面等待。而当第一个线程执行完newSingleton()语句后,便会退出锁定区域,此时,第二个线程便可以进入lock语句块,此时,如果没有第二重singletonnullnewSingleton()这样第二个线程也会创建一个Singleton实例,这样也还是违背了单例模式的初衷的,细心的朋友一定会发现,如果我去掉第一重singletonnull,程序还是可以在多线程下完考虑在没有第一重singletonnull的情况下,当有两个线程同时到达,此时,由于lock机制的存在,第一个线程会进入lock语句块,并且可以顺利执行newSingleton(),当第一个线程退出lock语句块时,singleton这个静态变量已不为null了,所以当第二个线程进入lock时,还是会被第二重singletonnull挡在外面,而无法执行new所以在没有第一重singletonnull的情况下,也是可以实现单例模式的?那么为什么需要第一重singleton==null呢?这里就涉及一个性能问题了,因为对于单例模式的话,newSingleton()只需要执行一次就OK了,而如果没有第一重singletonnull的话,每一次有线程进入GetInstance()时,均会执这是非常耗费性能的,而如果我加上第一重singletonnull的话,那么就只有在第一次,也就是singleton==null成立时的情况下执行一次锁定以实现线程同而以后的话,便只要直接返回Singleton实例就OK了而根本无需再进入lock语句块了,懒汉式呢,就是这个单例类的这个唯一实例是在第一次使用GetInstance()时实例化的,如果您不调用GetInstance()的话,这个实例是不会存在的,即为null其实呢,我前面在介绍单例模式的这几个Demo中都是使用的懒汉式单例,看下面的GetInstance()publicstaticSingleton{if(singleton=={lock{if(singleton=={singleton=new}}}return}从上面的这个GetInstance()中可以看出这个单例类的唯一实例是在第一次调用在C#中,可以用特殊的方式实现饿汉式单例,即使用静态初始化来完成饿汉式单例模式namespace{publicsealedclass{privatestati
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 煤炭购销合同担保书
- 代购合作协议合同
- 燃气承包合同
- 江苏商品房买卖合同模板
- 合同书电子版
- 安装合同简单版样本
- 2025年人教A版九年级历史下册月考试卷含答案
- 2025年外研衔接版九年级历史下册阶段测试试卷
- 2025年沪教版必修2历史上册月考试卷含答案
- 2025年湘教版九年级地理下册月考试卷
- 客车交通安全培训课件
- 艺术培训校长述职报告
- ICU新进人员入科培训-ICU常规监护与治疗课件
- 人教版一年数学下册全册分层作业设计
- 选择性必修一 期末综合测试(二)(解析版)2021-2022学年人教版(2019)高二数学选修一
- 学校制度改进
- 各行业智能客服占比分析报告
- 年产30万吨高钛渣生产线技改扩建项目环评报告公示
- 民谣酒吧项目创业计划书
- 2023年珠海市招考合同制职员笔试参考题库(共500题)答案详解版
- 心电监护考核标准
评论
0/150
提交评论