zoukankan      html  css  js  c++  java
  • 谨慎设计一个单例类

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

        

  • 相关阅读:
    Ubuntu 16.04安装双显卡驱动方法收集
    Log4j的日志级别分析(转)
    Linux下使用Curl调用Java的WebService接口
    OSGI是什么
    Netflix是什么,与Spring Cloud有什么关系
    Ubuntu 16.04安装SQLite Browser操作SQLite数据库
    Eclipse关联JDK源码
    Markdown中插入图片技巧收集
    Mac OS X中Launchpad的图标添加删除方法(添加方法别试了,和Linux很大区别)
    Java反编译工具-JD-GUI
  • 原文地址:https://www.cnblogs.com/shouhongxiao/p/3530091.html
Copyright © 2011-2022 走看看