谨慎设计一个单例类

   如果设计成一个单例类,虽然不存在对象频繁回收,可要长期占用资源。而且意味着外面对多线程,到了这里需要排队进入。什么时间设计成单例呢?设计一个单例就意味着, 我们存在资源竞争,必须的,二,我们要频繁创建对象,销毁对象(一般最多可见Utility)。资源竞争我们用在数据库操作,文件操作,队列,静态变量。但像上面说的,设计一个单例,问题很多,因为我们设计的想法,就是通用性。处了上面的情况,非必须最好不设计单例模式(效率问题),最佳的方式,让调用者根据使用情况单例化被调用者。好处是,一,延迟加载了使用时间,二、可以被调用者的销毁而回收。在设计单例时,我们要分析效率,我们经常设计的单例方式

 

public class VFactory
 {
     private static VFactory instance = null;
     private static object threadSafeLocker = new object();

     public void Read()
     {
     
     }
     
     public void Write()
     {

     }

      public static VFactory Instance
        {
            get
            {
                if (null == instance)
                {
                    lock (threadSafeLocker)
                    {
                        if (null == instance)
                        {
                            instance = new VFactory;
                           

                        }
                    }
                }
                return instance;
            }
        }
 }


很典型的单例,可问题很多,效率不高,所有线程在进入的时候,都需要排队,如果一个线程是要执行Read 而另一个要执行Write ,实际的情况我们大部门时间(一个共享变量或队例,不会改变)在浪费时间,read的时机我们不需要加锁,而仅仅Write时,所以设计一个静态方法,不是更好吗?而且如果是单例,那你必须小心操作它内部的变量不仅是Static 变量,private、 protected 也必须小心,如果不加锁,也是会出错误的。最好办法,让它的调用者控制,调用者如果是N个线程,那这N个线程都会指向一个单例地址Copy ,而在调用者内,都存在N份单例的内部变量。

    总结:非必须不设计单例模式,(.net 回收很快的) ,读写同时存在时,设计静态方法。让调者考虑实例方式。

    

posted @ 2014-01-22 17:19  一点点水  阅读(629)  评论(0编辑  收藏  举报