C++单例模式的几种实现方法详解

C++单例模式的几种实现方法详解

什么是单例模式

单例模式是一种创建型设计模式,它保证一个类只有一个实例,并提供一个全局访问点。

为什么要用单例模式

在实际开发过程中,有些类只需要有一个实例,如果多次实例化,会造成资源浪费。同时保持全局唯一的实例,方便对该实例进行管理和控制,提高程序的可维护性和可拓展性。

实现方法

饿汉式(线程安全)

饿汉式是一种比较常见的单例模式实现方法,在类加载时就创建唯一实例,并使用静态变量进行保存。该方法的优点是线程安全,调用速度快,缺点是如果该对象不需要使用,也会进行创建,浪费内存。

示例代码:

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

Singleton* Singleton::instance = new Singleton();

懒汉式(线程不安全)

懒汉式是一种比较常见的单例模式实现方法,在第一次使用时才创建。该方法的优点是节省内存,缺点是没有考虑线程安全问题。

示例代码:

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

Singleton* Singleton::instance = nullptr;

懒汉式(线程安全)

懒汉式也可以实现线程安全,常见的实现方法是使用互斥锁或使用double-checked locking技术(DCLP)。

互斥锁

示例代码:

#include <mutex>

class Singleton {
private:
    static std::mutex mtx;
    static Singleton* instance;
    Singleton() {};
public:
    static Singleton* getInstance() {
        std::lock_guard<std::mutex> lock(mtx);
        if (instance == nullptr) {
            instance = new Singleton();
        }
        return instance;
    }
};

Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mtx;

double-checked locking技术

示例代码:

class Singleton {
private:
    static Singleton* instance;
    Singleton() {};
public:
    static Singleton* getInstance() {
        if (instance == nullptr) {
            std::lock_guard<std::mutex> lock(mtx);
            if (instance == nullptr) {
                instance = new Singleton();
            }
        }
        return instance;
    }
};

Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mtx;

懒汉式(线程安全,且能够多线程并发)

懒汉式(线程安全,且能够多线程并发)是一种较为复杂的实现方法,常见的实现方法是使用C++11的特性-局部静态变量。该方法能够实现懒加载,线程安全,且能够多线程并发。

示例代码:

class Singleton {
public:
    static Singleton& getInstance() {
        static Singleton instance;
        return instance;
    }
private:
    Singleton() {}
    Singleton(const Singleton& rhs) {}
    Singleton& operator=(const Singleton& rhs) {}
};

总结

单例模式是一种非常实用的设计模式,可以减少系统内部的重复实例化,降低系统开销,提高程序的可维护性和可拓展性。在使用时需要注意线程安全问题,在不同的线程环境中选择不同的单例实现方法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++单例模式的几种实现方法详解 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • 让PHP以ROOT权限执行系统命令的方法

    为了让PHP以ROOT权限执行系统命令,我们可以采用以下几种方法: 方法一:利用sudo命令 首先需要确保服务器上已经安装sudo,并且已经配置好了sudoers文件,即在sudoers文件中添加了允许PHP执行特定命令的规则,例如: www-data ALL=(ALL:ALL) NOPASSWD: /usr/bin/command 其中,www-data是…

    C 2023年5月22日
    00
  • 详解如何从Matlab中导出清晰的结果图片

    下面是导出清晰结果图片的攻略: 1. 设置高分辨率 首先,我们需要保证图片的分辨率足够高,以保证导出的图片清晰。可以通过设置figure的 Size 和 DPI 属性来实现: % 创建一个高分辨率figure fig = figure(‘Units’, ‘inches’, ‘Position’, [0 0 6 4], ‘PaperPositionMode’,…

    C 2023年5月23日
    00
  • 如何通过wrap malloc定位C/C++的内存泄漏问题

    如果要通过 wrap malloc 定位 C/C++ 的内存泄漏问题,我会按照以下步骤进行: 1. 使用 wrap malloc wrap malloc 是一个 Linux 平台提供的工具,它可以拦截程序中的内存分配函数,比如 malloc 和 realloc,来实现内存泄漏的定位。首先需要安装 libwrap0-dev: sudo apt-get upda…

    C 2023年5月23日
    00
  • c++ 探讨奶牛生子的问题

    C++ 探讨奶牛生子的问题 问题描述 有 $N$ 只奶牛,每个奶牛的繁殖周期为 $M$ 年,每只奶牛出生后第 $1$ 年不生育,第 $2$ 年起每年生下一只小奶牛,小奶牛出生后第 $1$ 年也不能生育,第 $2$ 年起也可以生下一只小奶牛。假设所有的奶牛都没有死亡,请问 $T$ 年后一共有多少只奶牛? 解题思路 本题可以采用递归或者动态规划的方式进行求解。我…

    C 2023年5月23日
    00
  • C语言实现歌曲信息管理系统

    C语言实现歌曲信息管理系统攻略 1. 系统设计 歌曲信息管理系统是一种针对音乐爱好者实现音乐管理的软件系统,主要包括五个模块:歌曲信息录入、歌曲信息查询、歌曲信息修改、歌曲信息删除和退出系统。 1.1 数据结构设计 系统主要使用结构体来存储歌曲信息,每个结构体包括歌曲名称、歌手名称、专辑名称、发行日期和歌曲时长等信息。 struct Song { char …

    C 2023年5月23日
    00
  • 毕业答辩的ppt怎么写? 毕业答辩的ppt的制作技巧

    下面是毕业答辩PPT的制作攻略,分为以下几个步骤: 1.明确PPT的目的和主题 在制作PPT之前,我们需要先想清楚PPT的主题和目的,展示内容和要讲解的重点,对于毕业答辩PPT来说,最好能够简洁明了地介绍自己的研究方向、主要研究内容和研究成果。 2.制作PPT的结构 PPT的结构要清晰且合理,通过分章节、剖析问题、展示数据等多种方式为听众呈现自己的研究成果。…

    C 2023年5月22日
    00
  • 紫米新品C-TO-C数据线配置怎么样?

    紫米新品C-TO-C数据线配置攻略 紫米新品C-TO-C数据线是一款高质量的USB数据线,采用了最新的Type-C接口,支持快速充电和数据传输,同时还具备高品质的工艺和材料,对于喜欢使用高品质产品的用户来说,是一个很好的选择。本攻略将从以下几个方面详细讲解该数据线的配置情况。 长度 紫米新品C-TO-C数据线有多种长度可选,包括0.5米、1米、2米和3米。用…

    C 2023年5月23日
    00
  • windows启动失败 未能成功启动状态0xc00000e9怎么办?

    Windows启动失败 未能成功启动状态0xc00000e9解决攻略 什么是“未能成功启动状态0xc00000e9”? 在Windows系统启动时,如果出现“未能成功启动状态0xc00000e9”的错误提示,意味着系统在尝试访问硬盘或其他存储设备时遇到了问题,导致无法正常启动系统。 怎样解决“未能成功启动状态0xc00000e9”错误? 方法一:检查存储设备…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部