C++中的单例模式

1、懒汉式(1)

class Singleton {
public:
  static Singleton* getInstance() {
    if (_instance == nullptr) {
      _instance = new Singleton();
    }
    return _instance;
  }

private:
  static Singleton* _instance;
};

Singleton* Singleton::_instance = nullptr;
  • 懒加载,在需要的时候创建实例
  • 线程不安全,当A线程创建实例时,恰好B线程也在执行当前代码,A线程和B线程都会创建一份实例

2、懒汉式(2)

class Singleton {
public:
  static Singleton* getInstance() {
    lock_guard<mutex> lock(_mutex);
    if (_instance == nullptr) {
      _instance = new Singleton();
    }
    return _instance;
  }

private:
  static Singleton* _instance;
  static mutex _mutex;
};

Singleton* Singleton::_instance = nullptr;
mutex Singleton::_mutex;
  • 懒加载,线程安全
  • 加锁会消耗性能

3、饿汉式

class Singleton {
public:
  static Singleton* getInstance() {
    return _instance; 
  }

private:
  static Singleton* _instance = new Singleton();
};
  • 编写简单,执行效率高,线程安全
  • 无论是否使用,都会创建实例,会浪费资源

4、Meyers' Singleton(现在代码里面使用的)

class Singleton { 
public:
  Singleton(const Singleton &) = delete;
  Singleton& operator=(const Singleton &) = delete;

  static Singleton& getInstance() {
    // 静态局部变量
    static Singleton instance; 
    return instance;
  }

private:
  Singleton() {}
};
  • 静态局部变量只会在第一次函数调用时初始化,后续再次调用不会初始化实例
  • 懒加载,只有在使用到时,才会创建实例
  • 返回引用可以防止指针被delete或者被置空
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容