单例模式两种实现方法

设计模式

单例模式:

复制代码
#include <iostream>
#include<mutex>

class MyCAS {
private:
  MyCAS() {};
  MyCAS(const MyCAS*) = delete;
  MyCAS& operator=(const MyCAS*) = delete;
private:
  static MyCAS* m_instance;
  static std::mutex m_mutex;

public:

  static MyCAS* GetInstance() {
    if (m_instance == nullptr) {
      std::lock_guard<std::mutex> lock(m_mutex);
      if (m_instance == nullptr) {
        m_instance = new MyCAS();
        static CGarhuishou cl;
      }

    }
    return m_instance;
  };

  class CGarhuishou {
  public:
    ~CGarhuishou() {
      if (MyCAS::m_instance) {
        delete MyCAS::m_instance;
        MyCAS::m_instance = nullptr;
      }
    }
  };
  void func() {
    std::cout << "测试" << std::endl;
  }
};
MyCAS* MyCAS::m_instance = nullptr;
std::mutex MyCAS::m_mutex;

使用std::once_flag ,作为一个标记,std::call_once通过这个标记来决定对应传入的函数是否执行,调用call_once成功后,call_once会反转这个标记,这样再次调用这个call_once后,传入的函数就不会再次被执行了;

复制代码
#include <iostream>
#include<mutex>

class MyCAS {
private:
  MyCAS() {};
  MyCAS(const MyCAS*) = delete;
  MyCAS& operator=(const MyCAS*) = delete;
private:
  static MyCAS* m_instance;

  static std::once_flag m_flag;
public:
  static void CreateInstance() {
    m_instance = new MyCAS();
    static CGarhuishou cl;
  }
  static MyCAS* GetInstance() {

    std::call_once(m_flag, CreateInstance);

    return m_instance;
  };

  class CGarhuishou {
  public:
    ~CGarhuishou() {
      if (MyCAS::m_instance) {
        delete MyCAS::m_instance;
        MyCAS::m_instance = nullptr;
      }
    }
  };
  void func() {
    std::cout << "测试" << std::endl;
  }
};
MyCAS* MyCAS::m_instance = nullptr;

std::once_flag MyCAS::m_flag;
相关推荐
我材不敲代码1 小时前
Python基础:列表详解、增删改查及常用高阶操作
开发语言·windows·python
AI玫瑰助手2 小时前
Python运算符:成员运算符(in/not in)的使用场景
开发语言·python·信息可视化
AI人工智能+电脑小能手2 小时前
【大白话说Java面试题 第77题】【Mysql篇】第7题:回表查询与全表扫描的区别?
java·开发语言·数据库·mysql·面试
水木流年追梦2 小时前
大模型入门-大模型分布式训练2
开发语言·分布式·python·算法·正则表达式·prompt
口袋里のInit3 小时前
基础知识——ARM M核入栈出栈流程
开发语言·arm开发
罗超驿3 小时前
5.Java线程创建全攻略:5种写法 + 高频面试题解析
java·开发语言·java-ee
Simon523143 小时前
反射------5.26学习小计
java·开发语言·spring boot
ComputerInBook3 小时前
C++ 23 相比 C++ 20 新增之特征
开发语言·算法·c++23
一知半解仙3 小时前
Claude Code的跨平台安装教程
java·开发语言·人工智能·开源