C++ 单例模式(懒汉、饿汉模式)
2021-05-18 15:30
标签:singleton [] 9.png protect 简单 wait font 后退 ESS 1、简单的单例模式实现 2、C++的构造函数不是线程安全的,所以上述代码在多线程的情况下是不安全的,原因是new Singelton时,这句话不是原子的,比如一个线程执行了new的同时,另一个线程对if进行判断(此时实例还没被创建出来)。在windows下模拟: 运行结果: 该单例模式也称为懒汉式单例。 懒汉:故名思义,不到万不得已就不会去实例化类,也就是说在第一次用到类实例的时候才会去实例化。与之对应的是饿汉式单例。(注意,懒汉本身是线程不安全的,如上例子) 饿汉:饿了肯定要饥不择食。所以在单例类定义的时候就进行实例化。(本身就是线程安全的,如下例子) 关于如何选择懒汉和饿汉模式: 特点与选择: 懒汉:在访问量较小时,采用懒汉实现。这是以时间换空间。 饿汉:由于要进行线程同步,所以在访问量比较大,或者可能访问的线程比较多时,采用饿汉实现,可以实现更好的性能。这是以空间换时间。 3、饿汉式的单例实现 运行结果: 4、线程安全的懒汉式单例的实现 饿汉式会提前浪费我们的内存空间以及资源,如果有项目中要求我们在使用到实例的时候再去实例化,则还是需要使用懒汉式。 C++ 单例模式(懒汉、饿汉模式) 标签:singleton [] 9.png protect 简单 wait font 后退 ESS 原文地址:https://www.cnblogs.com/xuelisheng/p/9744301.html#include
#include
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;
}