资深工程师为何否定这种单例模式

     本人在  横刀天笑 的一篇谈论单例模式的文章 http://www.cnblogs.com/yuyijq/archive/2007/10/07/915941.html
里面有两种写单例的例子.有一种方法得到 资深工程师的否定.事实证明他的想法是错误的。
 
   第一种:

    public   class  Singleton
 2 {
 3    private static Singleton _instance = null;
 4    private static readonly object lockHelper = new object();
 5    private Singleton()
 6    {
 7    }

 8    public static Singleton CreateInstance()
 9    {
10        //这样lock以及lock块内的代码只会在第一次调用CreateInstance方法的时候执行,
11        //第一次调用该方法后_instance就不再为null了,if块内的代码就无须执行了
12        if(_instance == null)
13        {
14            lock(lockHelper)
15            {
16                if(_instance == null)
17                    _instance = new Singleton();
18            }

19        }

20        return _instance;
21    }

22}

      这种方法也是大家公认的能够在多线程下面正常工作的一种方法.

      原文中还提到了一种方法:

     实际上在很多地方我们可以采用另外一种初始化的方式,特别对于哪些实时系统或者哪些系统随时都会用的类(比如系统配置类),我们用另外一种实现方法就不需要考虑线程安全的问题了,它们的线程安全由.net运行时为我们作保证。

 

 1 public   class  Singleton
 2 {
 3    //先实例化出一个实例再说
 4    private static Singleton _instance = new Singleton();
 5        private Singleton(){}
 6    public static Singleton CreateInstance()
 7    {
 8        return _instance;
 9    }

10}

    博主说这两种方法都可以,我自己也不太清楚它们之间的区别,但是本人记忆力好,记下了.

    一次在中软面试中,有一个题让你写一个单例模式例子出来,我想都没想就把上面第二种方法写出来了,当然我忘了写私有构造函数.这个也不影响思路.但是他们的技术人员说这不是单例模式,因为每次初始化类的时候就会new一次.
private static Singleton _instance = new Singleton();他可能是说这个.

   之后我亲自测试了下博主说的第二种方法,说明是可行的,并非多线程.起码单线程是可以的.
   
   我想他的意思应该是这样的:
  
public   class  Singleton2
    
{
        
//先实例化出一个实例再说
        private static Singleton2 _instance = null ;
        
private DateTime _stime;
        
public DateTime sTime
        
{
            
get return this._stime; }
            
set this._stime = value; }

        }

        
private Singleton2()
        
{
            
this.sTime = DateTime.Now;

        }

        
public static Singleton CreateInstance()
        
{
            
if (_instance == null)
            
{
                
return new Singleton2();

            }

            
else
            
{
                
return _instance;
            
            }

            
        }

    }
     
     经过我的测试,第三种代码是不正确的.

     我在MSDN上查了关于static的解释:

     static
    修饰符指明成员属于类本身而不属于类的实例。即使创建了类的多个实例,给定应用程序中只存在 static 成员的一个副本。您只能通过对类的引用(而不是对实例的引用)来访问 static 成员。但是,在类成员声明中,可以通过 this 对象来访问 static 成员。
    类的成员可以使用 static 修饰符来标记。类、接口和接口的成员不能采用 static 修饰符。不能将 static 修饰符与任何继承修饰符(abstract 和 final)或版本安全修饰符(hide 和 override)组合。

     这就说明了博主的说法是正确的,无论初始化多少次类,但是只会存在静态成员的一个副本.
     据说那个面试官是特别资深的工程师,他应该也有他的理由说那不是单例,我想让大家给说说第二种代码是否是真正的单例模式. 

     谢谢大家对的帮助,今天回家看了下《HEAD FIRST 设计模式》在P181中明确的说明了上文中的第二种方法是可行的,也是真正的单例模式:

     原文是这样的:

     2。使用“急切”创建实例,页不用延迟实例化的做法
     如果应用程序总是创建并使用单件实例,或者在创建和运行时方面的负担不太繁重,你可能想要急切(eagerly)创建此单件,如下所示:
     代码和上文中第二种方法是一模一样的。还特意对:private static Singleton _instance = new Singleton();这条语句进行说明:
     在静态初始化器中创建单件,这段代码保证了线程安全。

     本文中第一种创建单件的方法属于延迟实例化的做法,只有当第一次调用的时候才会实例化类,没有用到时则不进行任何实例化操作。所有说当类实例化不是特别复杂,对服务器开销不大的时候这两种方法在最终作用上和效果上是一样的,没有本质区别。所以最后本人认为我面试中的面试官的观点是错误的。如果有理解错误的地方还望指点。

转载于:https://www.cnblogs.com/ASPNET2008/archive/2008/05/09/1190328.html

第1章 迎娶Windows XP 1.1 常规安装过程 1.1.1 安装前该做些什么 1.1.2 常规安装 3 1.2 自动安装 4 1.2.1 带参数的安装 1.2.2 无人值守安装 1.3 多系统安装 1.3.1 为Linux准备空间 1.3.2 用分区魔术师准备Linux空间 1.3.3 实战Windows XP/Linux双系统 1.3.4 用NTLDR实现多重引导 1.3.5 Windows与Linux资源共享 实例1:找回被Ghost误克隆的分区 实例2:跟我学做启动盘 实例3:卸载Windows,真的是一个问题吗 实例4:Windows Installer出错引起的安装故障 实例5:多系统安装又一法 实例6:从安装光盘中恢复安装IE 6.0 实例7:Windows补丁下载、批量安装、局域网分发一条龙 实例8:不用软件把Windows 2000彻底搬家到新分区 实例9:微软的软件安装也这么难 实例10:Windows的救命大师—原位升级 问答·技巧 第2章 安全,安全,还是安全 2.1 系统安全概述 2.2 系统保护 2.2.1 扫描系统漏洞与不安全设置 2.2.2 定时升级、更新系统 2.2.3 保护不安全端口 2.3 系统维护 2.3.1 系统监视 2.3.2 系统加密与隐藏 2.3.3 系统功能限制 2.4 病毒防范 2.4.1 病毒的手工清除 2.4.2 使用杀毒软件清除病毒 2.4.3 进行病毒监控 2.4.4 要建立好的防毒习惯 实例1:病毒库最快升级全方案 实例2:Windows 2000/XP安全设防三要素 实例3:乔装成DLL文件的新型恶意网页病毒 实例4:网络安全攻防拆解 实例5:光盘刻进病毒真的只能报废吗? 实例6:关好“比尔”家的后门——系统后门大揭秘 第3章 自古用机谁无死 3.1 Windows XP常见问题排困解难 3.1.1 软件故障的排困解难 3.1.2 硬件故障的排困解难 3.2 芝麻开门——无法进入Windows的解决方案 3.2.1 Windows XP系统还原 3.2.2 使用Windows XP故障恢复控制台 3.3 Windows XP超级替补──维护磁盘面对面 3.3.1 超级巨无霸——ERD Commander 2003 3.3.2 四两拨千斤──超级通用DOS 7.10启动盘 实例1:当故障恢复控制台失效的时候…… 实例2:遭遇系统故障该怎样有效提问(上) 实例3:遭遇系统故障该怎样有效提问(下) 实例4:常见Windows故障消息及解决流程 问答·技巧 第4章 备份与修复 4.1 数据备份 4.1.1 什么情况下需要数据备份 4.1.2 硬盘及分区备份 4.1.3 系统备份 4.1.4 邮件档案备份 4.1.5 数字证书备份 4.1.6 注册表备份 4.1.7 系统配置文件的备份 4.1.8 MSN和QQ相关资料的备份 4.2 系统修复 4.2.1 修复注册表 4.2.2 修复操作系统 4.2.3 修复被破坏的硬盘 4.2.4 常见存储介质CD、CD-R、CD-RW、U盘和数码相机内存卡的修复 4.2.5 常用邮件、图片、影像、ZIP、MS Office、声音文件的修复 实例1:系统恢复与备份一键搞定—史上最完美的一键恢复、备份系统 实例2:Windows 2000/XP注册表终极备份与恢复 实例3:DIY一劳永逸的日期备份工具 实例4:最简单的全自动备份工具来了 实例5:拿什么来拯救你—硬盘损坏与坏道修复全接触 实例6:把大象装进冰箱—700MB刻录盘也能备份DVD 实例7:一个命令搞定Ghost备份与恢复 实例8:输入法图标故障修复两则 实例9:把个人数据轻松移出危险地带 问答·技巧 第5章 Windows XP极品优化 5.1 启动过程优化 5.1.1 硬盘子系统的正确设置 5.1.2 用户自动登录 5.1.3 手动设置网卡的IP地址 5.1.4 Bootvis真的可以优化Windows XP启动过程吗? 5.1.5 清除开机加载程序 5.1.6 配置预读取(Prefetch)功能 5.2 磁盘子系统性能优化 5.2.1 磁盘缓存的优化 5.2.2 磁盘碎片整理 5.2.3 优化虚拟内存设置 5.3 注册表优化设置 5.4 Windows XP瘦身有术 5.4.1 删除不必要的Windows组件 5.4.2 取消休眠功能 5.4.3 删除驱动程序备份 5.4.4 取消系统文件备份 5.4.5 优化“视觉效果”设置 5.4.6 铅华洗尽的Windows XP 5.5 应用程序优化 5.5.1 把优化进行到底──Windows优化大师 5.5.2 哈立波特的魔法衣——超级兔子魔法设置 实例1:向资源管理器“讨回”移动硬盘 实例2:输入法里的烦恼,都是CTFMON惹的祸 实例3:开机后自动进入system32系统文件夹问题的解决 实例4:神秘的自启动程序都藏在哪儿? 实例5:Windows XP自作主张关机重启 实例6:关机的故障解决与技巧 实例7:运行自己创建的命令行 实例8:节省系统资源新方案—上网一键通,下线一键关 实例9:通过注册表进行系统内存优化 实例10:木马引起的应用程序关联错误 问答·技巧 第6章 网络设置和应用 6.1 配置Windows 98/Me对等网 6.1.1 网络协议的配置 6.1.2 设置文件共享 6.1.3 设置打印机共享 6.2 配置Windows 2000/XP对等网 6.2.1 网络协议的配置 6.2.2 设置文件共享 6.2.3 设置打印机共享 6.2.4 共享网络资源 6.3 共享数据的安全 6.3.1 共享文件夹的隐藏 6.3.2 共享文件夹的加密 6.3.3 共享文件夹的访问控制 6.4 SOHO和家庭网络共享Internet接入 6.4.1 共享Internet网络的连接 6.4.2 将Windows 98/Me/2000/XP设置为ICS服务器 6.4.3 Windows 98/Me/2000/XP客户端的设置 6.5 对远程计算机的控制 6.5.1 远程控制的功能和应用 6.5.2 Windows XP远程桌面 6.5.3 远程桌面的实现 6.5.4 对内部网络计算机的控制 实例1:全面解决邻里不合──局域网经典故障解决 实例2:一招实现远程唤醒与远程关机 实例3:相约局域网,大片共欣赏 实例4:远程创建/删除FTP服务 对等网络常见故障的解决 第7章 系统高手之多媒体篇 7.1 音频播放 7.1.1 Windows系统之音频相关功能概述 7.1.2 Windows Media Player 音频功能的设置和优化 7.1.3 相关组件 7.1.4 音频娱乐 实例篇 实例1:让音乐更加动听 实例2:酷一族——播放OGG、APE音乐 实例3:连通四海收听——网络电台 实例4:打造你的音乐专辑 实例5:制作CD音乐盘 实例6:CD瘦身进硬盘 实例7:录制声音 7.2 视频播放 7.2.1 Windows 系统视频功能概述 7.2.2 Windows Media Player 视频功能的设置和优化 7.2.3 相关多媒体组件介绍 7.2.4 视频娱乐 实例篇 实例1:播放DVD 实例2:武装Windows Media Player,欣赏DVDrip大片 实例3:播放RM、RMVB影片 实例4:让影片效果更完美 实例5:数码吧——制作电子相册 实例6:DV吧——制作属于你的视频 实例7:在网络上发布自己的视频作品 7.3 图形图像处理 7.3.1 相关功能和组件介绍 7.3.2 数码相片的导入和编排 7.3.3 查看数码相片的拍摄信息 附录 BIOS相关设置 1.1 BIOS知识点滴 1.1.1 认识BIOS与CMOS 1.1.2 BIOS如何工作 1.1.3 BIOS设置的作用 1.1.4 BIOS设置程序简介 1.2 BIOS设置经典案例 1.2.1 检测篇 1.2.2 提速篇 1.2.3 防护篇 1.2.4 应用篇 1.2.5 故障排除篇 1.3 升升不息——升级BIOS 1.3.1 升级主板BIOS 1.3.2升级显示卡BIOS 1.3.3 升级光驱、刻录机、DVD光驱Firmware 1.3.4 升级Modem Firmware 1.3.5 升级数码相机Firmware 1.3.6 升级MP3播放机Firmware 1.3.7 升级笔记本电脑BIOS 。。。。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值