之前使用单例模式一直定义如下:    public partial class Personnel
    {
        static volatile Personnel _instance = null;
        static readonly object Padlock = new object();
        private readonly DaoManager _daoManager = null;
        private readonly ICommonDao _commonDao = null;
        
        private Personnel()
        {
            _daoManager = ServiceConfig.GetInstance().DaoManager;
            _commonDao = _daoManager[typeof(ICommonDao)] as ICommonDao;
        }
        /// <summary>
        /// 获取单一实例
        /// </summary>
        /// <returns></returns>
        public static Personnel GetInstance()
        {
            if (_instance == null)
            {
                lock (Padlock)
                {
                    if (_instance == null)
                    {
                        _instance = new Personnel();
                    }
                }
            }
            return _instance;
        }
    }这几天做一个项目,发现我们项目经理定义单例模式是这么做的:    public partial class Personnel
    {
        private static Personnel _instance = new Personnel () ;
        static readonly object Padlock = new object();
        private readonly DaoManager _daoManager = null;
        private readonly ICommonDao _commonDao = null;
        
        private Personnel()
        {
            _daoManager = ServiceConfig.GetInstance().DaoManager;
            _commonDao = _daoManager[typeof(ICommonDao)] as ICommonDao;
        }
        /// <summary>
        /// 获取单一实例
        /// </summary>
        /// <returns></returns>
        public static Personnel GetInstance()
        {
            return _instance;
        }
    }请问这两种定义单例模式的方法有没有什么差别呢?C#单例模式设计模式

解决方案 »

  1.   

    如果实例化对象比较耗时/耗系统资源,或者程序运行并不一定用到的话,会采用lazy load,即第一种方式。通常来说如果该对象总要用到或者访问次数较多,那么干脆就用第二种方式,由于这种方式省掉了判断和锁定处理,效率会高一些。
      

  2.   

    1、安全上,一样安全。CLR在初始化类的时候,已经加锁了。所以第二种也是安全的。
    2、延迟加载上,两种方法都会延迟加载。区别是:
    第一种方法在第一次调用Personnel.GetInstance()的时候加载;
    第二种方法在第一次用到Personnel类的时候加载。一般来说,如果没有特殊需求,第二种方法比较流行。一是写法简单,二是不需要加锁。
      

  3.   

    第一种好,只有一种极端情况可能比第二种慢,就是在没有初始化的情况下瞬间打入超多的请求,导致超多的lock等待,除此之外,所有的请求都会在第一层的==null的判断就结束了,没有进入lock的必要
      

  4.   

    第一种是Java的写法照搬过来的;
    而.NET的静态是线程安全的,第二种在.NET中无任何问题
      

  5.   

    记得好像最简单的就是 publice static readonly Singleton instanse=new Singleton();
    然后构造函数私有就可以了。