zoukankan      html  css  js  c++  java
  • 单例模式 C++

    0x01  概念  

      单例模式最初的定义出现于《设计模式》(艾迪生维斯理):“保证一个类仅有一个实例,并提供一个访问它的全局访问点。”

      单例模式该的实现:构造函数声明为private或protect防止被外部函数实例化,内部保存一个private static的类指针保存唯一的实例,实例的构造是一个public的static静态类方法,该方法返回单例类唯一的实例。

    0x02  实现方式

      

       1.懒汉模式(临界区实现线程安全)

       不到万不得已就不会去实例化类,也就是说在第一次用到类实例的时候才会去实例化,这是懒汉实现。

       由于要进行线程同步,所以在访问量比较大,或者可能访问的线程比较多时,采用饿汉实现,可以实现更好的性能。这是以空间换时间。

    class singleton
    {
    protected:
      singleton()
      {
    	InitializeCriticalSection(&CriticalSection);//初始化临界区
      }
       ~singleton()
      {
    	DeleteCriticalSection(&CriticalSection);  //销毁临界区
      }
    private:
      static singleton* p;
    public:
      CRITICAL_SECTION CriticalSection; //临界区
      static singleton* initance();
    };
     
    pthread_mutex_t singleton::mutex;
    singleton* singleton::p = NULL;
    singleton* singleton::initance()
    {
      if (p == NULL)
      {
       	EnterCriticalSection(&CriticalSection);      //进入临界区
        if (p == NULL)
          p = new singleton();
    	LeaveCriticalSection(&CriticalSection);
      }
      return p;
    }
    

     内部静态变量的懒汉实现:

    class singleton
    {
    protected:
      singleton()
      {
        pthread_mutex_init(&mutex);
      }
    public:
      static pthread_mutex_t mutex;
      static singleton* initance();
      int a;
    };
     
    pthread_mutex_t singleton::mutex;
    singleton* singleton::initance()
    {
      pthread_mutex_lock(&mutex);
      static singleton obj;
      pthread_mutex_unlock(&mutex);
      return &obj;
    }
    

      

       2.饿汉模式(本身满足多线程安全)

        饿汉饥不择食,在单例类定义的时候就进行实例化。

        在访问量较小时,采用懒汉实现。这是以时间换空间。

      

    class singleton
    {
    protected:
      singleton()
      {}
    private:
      static singleton* p;
    public:
      static singleton* initance();
    };
    singleton* singleton::p = new singleton;
    singleton* singleton::initance()
    {
      return p;
    }
    

      

  • 相关阅读:
    CentOS 6.5 源码安装subversion-1.8.8,附加mod_dav_svn模块
    MySQL建表设置外键提示错误
    Servlet3.0提供的异步处理
    Servlet3.0使用@WebServlet注解配置问题记录
    我的博客开通啦!
    关于Wii的蓝牙接收
    关于Wii的软件制作
    提升学习算法简述:AdaBoost, GBDT和XGBoost
    决策树中的熵和基尼指数
    机器学习排序算法:RankNet to LambdaRank to LambdaMART
  • 原文地址:https://www.cnblogs.com/lsh123/p/7501015.html
Copyright © 2011-2022 走看看