1. 单例模式是什么
单例模式保证某一个类在系统中只存在一个实例对象。无论任何时候有且只有一个实例对象。
单例模式应用场景:
在我们经常会碰到只需要创建一个实例的情况,例如: 配置文件,日志对象,线程池,缓存等。
比如,设置一个实例对象专门负责配置文件的读写,可以避免多个实例对象出现同时读写配置的文件的情况(造成日志错乱)
线程池,线程池对象需要占用大量资源,如果多次实例化线程池对象会造成很大的而资源浪费。
2.编写单例模式基本步骤
- 将构造函数声明为私有
- 在类中声明一个私有的静态类对象
- 定义一个静态public类型对象获取函数
单例模式又分为“饿汉”和“懒汉”模式。
饿汉模式:类对象立即加载,在类加载初始化的时候就主动创建实例;
懒汉模式 :等到真正使用的时候才去创建实例,不用时不去主动创建。
特点与选择:
由于要进行线程同步,所以在访问量比较大,或者可能访问的线程比较多时,采用饿汉实现,可以实现更好的性能。这是以空间换时间。
在访问量较小时,采用懒汉实现。这是以时间换空间。
3. “饿汉”模式
“饿汉”模式,无论是否调用该类的实例,进程都会创建一个该类的实例。饿汉模式是线程安全的,因为在程序编译阶段,程序就创建好了实例,不会有多个线程同时去创建实例。
#include<iostream>
using namespace std;
class Singleton{
private:
static Singleton *single;
Singleton(){}
public:
static Singleton* getIntance();
};
Singleton *Singleton::single = new Singleton;
Singleton *Singleton::getIntance()
{
cout<<"getIntance\n";
return single;
}
4. “懒汉”模式
懒汉模式不同于饿汉模式,它没有提前(编译阶段)创建实例对象,而是在需要使用时才创建实例对象,这样就带来了线程安全性问题(有可能多个线程同时创建实例对象)
单线程下的懒汉模式
#include<iostream>
using namespace std;
class Singleton{
private:
static Singleton *single;
Singleton(){}
public:
static Singleton* getIntance();
};
Singleton *Singleton::single = NULL;
Singleton *Singleton::getIntance()
{
if(single == NULL)
{
single = new Singleton;
}
return single;
}
多线程环境下懒汉模式
class Singleton{
private:
static pthread_once_t g_once_control;
static pthread_mutex_t mutex;
static const Singleton *single;
Singleton(){}
~Singleton(){
pthread_mutex_destory(&mutex);
}
static void initMutex(){
pthread_mutex_init(&mutex,NULL);
}
public:
static Singleton* getIntance();
};
Singleton::single = NULL;
pthread_once_t Singleton::g_once_control = PTHREAD_ONCE_INIT;
Singleton *Singleton::getIntance()
{
pthread_once(&g_once_control,initMutex());
pthread_mutex_lock(&mutex);
if(single == NULL)
{
single = new Singleton;
}
pthread_mutex_unlock(&mutex);
return single;
}
网友评论