一.为什么会有单例模式呢?
有些时候我们的需求中会有固定数量的类的要求(比如数据库连接池,线程池等)。我们可以分配的资源是有限的,所以我们需要有有限个资源存在并进行管理。此时,单例模式出现。
二.单例模式分哪几种呢?
1.饿汉单例
单例类定义的时候就进行了实例化,就是提前准备下一次的饭菜。
class singleton {
private:
singleton() {}
static singleton *p;
public:
static singleton *instance();
};
singleton *singleton::p = new singleton();
singleton* singleton::instance() {
return p;
}
2.懒汉单例
第一次用到类实例的时候才会去实例化,就是饿了才知道找饭吃
class singleton {
private:
singleton() {}
static singleton *p;
public:
static singleton *instance();
};
singleton *singleton::p = nullptr;
singleton* singleton::instance() {
if (p == nullptr)
p = new singleton();
return p;
}
3.多线程中,如何保证安全呢?
(一).加锁、
class singleton {
private:
singleton() {}
static singleton *p;
static mutex lock_;
public:
static singleton *instance();
};
singleton *singleton::p = nullptr;
singleton* singleton::instance() {
lock_guard<mutex> guard(lock_);
if (p == nullptr)
p = new singleton();
return p;
}