谨慎设计一个单例类
如果设计成一个单例类,虽然不存在对象频繁回收,可要长期占用资源。而且意味着外面对多线程,到了这里需要排队进入。什么时间设计成单例呢?设计一个单例就意味着, 我们存在资源竞争,必须的,二,我们要频繁创建对象,销毁对象(一般最多可见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 回收很快的) ,读写同时存在时,设计静态方法。让调者考虑实例方式。