设计模式----单例模式

设计模式

大佬们提供的一些面对经典的常见场景,所给定的一些对应的解决方案

单例模式特点

比如说,某些类,就只能拥有一个对象

实现方式

懒汉模式

在需要用到这个对象时再实例化出对象

懒汉模式的核心思想就是“延时加载”,从而能够优化服务器的启动速度

实现

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;
 }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值