码迷,mamicode.com
首页 > 编程语言 > 详细

线程安全的单实例模式

时间:2018-09-07 01:03:45      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:方法   变量   模式   let   ini   第一次用   空间换时间   比较   饿汉   

我们都很清楚一个简单的单例模式该怎样去实现:构造函数声明为private或protect防止被外部函数实例化,内部保存一个private static的类指针保存唯一的实例,实例的动作由一个public的类方法代劳,该方法也返回单例类唯一的实例。单例大约有两种实现方法:懒汉与饿汉。
懒汉:故名思义,不到万不得已就不会去实例化类,也就是说在第一次用到类实例的时候才会去实例化,节省内存。
饿汉:饿了肯定要饥不择食。所以在单例类定义的时候就进行实例化。浪费内存
特点与选择:
由于要进行线程同步,所以在访问量比较大,或者可能访问的线程比较多时,采用饿汉实现,可以实现更好的性能。这是以空间换时间。
在访问量较小时,采用懒汉实现。这是以时间换空间。

首先是饿汉模式:

饿汉,线程安全,不会内存泄漏
class singleton
{
private:
static singleton*p;  
singleton() {}
~CSingleton()
  {
   if (p== NULL) { return ;}
   delete P;
   P = NULL;
   }
public:
    static singleton* initance();
    singleton* p = new singleton();//饿汉的体现,直接实例化,也就不存在线程不安全了。
    singleton* initance()
    {
      return p;
    }
};

  懒汉模式:

方法一:使用加锁来达到线程安全

class singleton
{
protected:
  singleton()
  {
    pthread_mutex_init(&mutex);
  }
private:
  static singleton* p;
public:
  static pthread_mutex_t mutex;
  static singleton* initance();
};
 
pthread_mutex_t singleton::mutex;
singleton* singleton::p = NULL;
singleton* singleton::initance()
{
  if (p == NULL)
  {
    pthread_mutex_lock(&mutex);
    if (p == NULL)
      p = new singleton();
    pthread_mutex_unlock(&mutex);
  }
  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;
}

  

线程安全的单实例模式

标签:方法   变量   模式   let   ini   第一次用   空间换时间   比较   饿汉   

原文地址:https://www.cnblogs.com/wuyepeng/p/9601936.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!