设计模式
大佬们提供的一些面对经典的常见场景,所给定的一些对应的解决方案
单例模式特点
比如说,某些类,就只能拥有一个对象
实现方式
懒汉模式
在需要用到这个对象时再实例化出对象
懒汉模式的核心思想就是“延时加载”,从而能够优化服务器的启动速度
实现
template <typename T>
class Singleton {
static T* inst;
public:
static T* GetInstance() {
if (inst == NULL) {
inst = new T();
}
return inst;
}
};
//这种实现方式没有考虑到线程安全
//下面给出一种线程安全版本的
//如果在创建这个线程时,有两个线程进入了,那么就会实例出两个对象,这与单例模式思想不符,但是
//后面再进入的话就不会有影响了
// 懒汉模式, 线程安全
template <typename T>
class Singleton {
volatile static T* inst; // 需要设置 volatile 关键字, 否则可能被编译器优化.
static std::mutex lock;
public:
static T* GetInstance() {
if (inst == NULL) { // 双重判定空指针, 降低锁冲突的概率, 提高性能.
lock.lock(); // 使用互斥锁, 保证多线程情况下也只调用一次 new.
if (inst == NULL) {
inst = new T();
}
lock.unlock();
}
return inst;
}
};
1. 加锁解锁的位置
2. 双重 if 判定, 避免不必要的锁竞争
3. volatile关键字防止过度优化
饿汉模式
在程序刚开始运行时就实例化出对象
实现
template <typename T>
class Singleton {
static T data;
public:
static T* GetInstance() {
return &data;
}
};