本人在 横刀天笑 的一篇谈论单例模式的文章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运行时为我们作保证。

 1public 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();这条语句进行说明:
     在静态初始化器中创建单件,这段代码保证了线程安全。

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

资深工程师为何否定这种单例模式相关推荐

  1. 资深工程师,专家,研究员等进阶

    > 高级.资深Android工程师进阶 * 研究新技术,优化app的功能,提升app的性能: * 自主编写相关的自动化测试用例: * 负责Android代码的重构,对代码质量监控: * 完善An ...

  2. 小米资深工程师瞿晋萍(男):米聊服务器的技术选型和架构设计

    小米资深工程师瞿晋萍:米聊服务器的技术选型和架构设计 - 资讯频道 - CSDN.NET 小米资深工程师瞿晋萍:米聊服务器的技术选型和架构设计 2012-07-07 11:04 | 238次阅读 | ...

  3. mssql 计划怎每隔n秒_前端:调你一个接口6秒还配资深工程师?后端:有24部分需要处理!...

    有关于做web开发的程序员,不知道你们有没有这样一种感受,那就是前端工程师与后端工程师之间有时也会存在鄙视链的关系,比如前端程序员会认为后端程序员没什么技术含量,不就是写个接口,获取一些数据而已,而前 ...

  4. 来自Google资深工程师的API设计最佳实践

    来自Google资深工程师Joshua Bloch的分享:API设计最佳实践 为什么API设计如此重要?API是一个公司最重要的资产. 为什么API的设计对程序员如此重要? API一旦发布,出于兼容性 ...

  5. 单片机 架构 程序 经验总结_单片机“死机”了怎么办?看看一个资深工程师的经验总结...

    原标题:单片机"死机"了怎么办?看看一个资深工程师的经验总结 单片机(Microcontroller,MCU) 又称为微控制器或嵌入式控制器,体积虽小,但使用方便,应用范围广泛,在 ...

  6. java+set+split_阿里资深工程师教你如何优化 Java 代码!

    原标题:阿里资深工程师教你如何优化 Java 代码! 作者 | 王超 责编 | 伍杏玲 明代王阳明先生在<传习录>谈为学之道时说: 私欲日生,如地上尘,一日不扫,便又有一层.着实用功,便见 ...

  7. 大公司的资深工程师和小公司的Leader如何决择?

    点击上方"CSDN",选择"置顶公众号" 关键时刻,第一时间送达! 作者简介:何俊林,某知名互联网公司开发人员,一直致力于多媒体开发.本文经授权转自作者同名公众 ...

  8. 专访百度资深工程师孙源:代码强迫症的死实践派

     专访百度资深工程师孙源:代码强迫症的死实践派 发表于2015-10-09 10:50| 4663次阅读| 来源CSDN| 4 条评论| 作者唐小引 MDCCiOS百度UI孙源SwiftObjec ...

  9. 他出身草根,却是 Google 资深工程师

    1 前言 我们知道,谷歌公司在选拔聘用人才的标准是出了名的高,并且有着极强的"名校情结",但是谷歌也曾经录用过一位没受过正规大学教育.连本科文凭都没有.基本全靠自学成才的草根码农, ...

最新文章

  1. github checkout 使用
  2. SlickEdit 2016(V21)
  3. JFreeChart DateAxis用法
  4. 皮一皮:前女友竟然说这种话...
  5. mysql附加服务器失败_今天,启动MySQL服务器失败,
  6. 树莓派搭建Django服务器通过远程访问
  7. 工程和模块的关系以及继承和依赖的概念
  8. argo 现水下永动机器人_现水下永动机器人 水下永动机器人有什么作用?
  9. vue computed 源码分析
  10. 移动wabAPP 开发 viewport 注意事项
  11. Java中接口的多继承
  12. c++基于asio的组播:windows linux通信
  13. linux挂载硬盘作用,Linux(挂载) mount umount作用
  14. 30行Python代码刷王者荣耀金币
  15. java商城的面试题,Java商城系统面试题(一)
  16. MATLAB中的信号处理
  17. sfc/Windows 资源保护找到了损坏文件但无法修复
  18. 有趣的数据结构——Linux内核中的链表(Black Aureole)
  19. 用原始代码制作简易的百度页面
  20. 谢烟客---------Linux之文件系统管理创建

热门文章

  1. python httplib2的安装
  2. 使用Automake和Autoconf生成Makefile
  3. 数据可视化【十四】交互式过滤地区分布图
  4. 1052 卖个萌 (20 分)
  5. Java面试题,java工程师求职简历
  6. 给后辈的一点建议,面试必会
  7. 腾讯云AI应用产品总监王磊:AI 在传统产业的最佳实践
  8. 扫盲丨关于区块链你需要了解的所有概念
  9. 深入理解ES6 pdf
  10. 【Python】 子进程创建与使用subprocess