zoukankan      html  css  js  c++  java
  • 创建型模式--单例模式

    单例模式:

        保证一个类仅有一个实例,并提供一个访问它的全局访问点。

    特点:

        1、私有的构造函数

        2、私有的复制构造函数

        3、私有的赋值操作符

    问题:

        1、线程安全

        2、数据的清理

    代码:

      一般有三种写法:

      方法一:一个不是线程安全的代码,而且也没有解决内存释放的问题:

     1 class Singleton
     2 {
     3 public:
     4     static Singleton* getInstance()
     5     {
     6 
     7         /**< 假如有两个线程,第一个线程运行时,判断pInstance是否为空,因为此时pInstance
     8          *   ==NULL,那么线程将会进入到if结构体内,假设,就在要执行new Singleton这个操作
     9          *   时,时间片结束,那么此时pInstance还是为NULL,此时另一个线程运行,当它进行判
    10          *   断时发现pInstance为空,所以会创建一次,当它执行完后,第一个线程执行,又会产
    11          *   生一个新的实例,那么将会产生两个,所以此时是线程不安全的。要想保证安全,必须
    12          *   if前面加锁
    13          */
    14         if(pInstance == NULL)
    15         {
    16             pInstance = new Singleton;
    17         }
    18         return pInstance;
    19     };
    20 private:
    21     Singleton(){};
    22     Singleton(const Singleton &);
    23     Singleton& operator=(const Singleton &);
    24 
    25     static Singleton *pInstance;
    26 };
    27 
    28 Singleton* Singleton::pInstance = NULL;

    方法二 :只解决了内存释放的问题:

      

     1 class Singleton
     2 {
     3 public:
     4     static Singleton* getInstance()
     5     {
     6         /**< 其实这里加上互斥操作,就可以实现,即是线程安全,又释放了内存 */
     7         if(pInstance == NULL)
     8         {
     9             pInstance = new Singleton;
    10         }
    11         return pInstance;
    12     };
    13 
    14     class Garbage
    15     {
    16     public:
    17         ~Garbage()
    18         {
    19             if(Singleton::pInstance)
    20             {
    21                 delete pInstance;
    22             }
    23         };
    24     };
    25 private:
    26     Singleton(){};
    27     Singleton(const Singleton &);
    28     Singleton& operator=(const Singleton &);
    29 
    30     static Singleton *pInstance;
    31     static Garbage m_Garbage;       /**<  当这个静态变量释放时,会自动去释放Singleton的资源*/
    32 };

    方法三:即解决了线程安全的问题,也解决了内存释放的问题

     1 class Singleton
     2 {
     3 public:
     4     static Singleton* getInstance()
     5     {
     6         /**< 此函数会在全局区中分配空间,而且在整个程序退出时,清理数据
     7         *   ,所以就不会存在线程不安全的情况
     8         */
     9         static Singleton single;
    10         return &single;
    11     };
    12 private:
    13     Singleton(){};
    14     Singleton(const Singleton &);
    15     Singleton& operator=(const Singleton &);
    16 };

     

  • 相关阅读:
    CTex中fig、table、equation与section的引用\label小注意
    中国科学院深圳先进技术研究院招聘研究助理、软件工程师、客座学生
    FFTW 3.2.2有bug?
    斯坦福大学的Realtime 3D internal marker tracking during arc radiotherapy by the use of combined MV–kV imaging
    转载:内存管理
    中国科学院深圳先进技术研究院招聘:助理研究员、研究助理、软件工程师、客座学生
    又一篇做retargeting的SIGGRAPH论文 scalable and coherent video resizing with perframe optimization
    Google和百度的map思索
    laplacian pyramid
    macroglossa.com有趣的image search engine
  • 原文地址:https://www.cnblogs.com/wang-can/p/3675523.html
Copyright © 2011-2022 走看看