C++ 单例模式的几种实现方式研究

C++单例模式的几种实现方式研究

什么是单例模式

单例模式(Singleton Pattern)是一种常用的软件设计模式,它保证了一个类仅有一个实例,并提供一个全局访问点。

单例模式的应用场景

单例模式在以下情况下被广泛应用:

  • 需要频繁创建对象,但创建的对象又非常耗费系统资源。
  • 系统只需要一个实例对象,如系统日志、系统文件等。
  • 当多个实例存在时会导致访问的内容不一致或者状态不同步。

如何实现单例模式

饿汉式

饿汉式在类加载时就创建了对象实例,也就是说在调用该类的getInstance()方法之前就已经存在了该对象,因此线程安全,但可能会浪费一部分系统资源。

示例代码:

class Singleton {
private:
    static Singleton* instance;

    Singleton() {}

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

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

懒汉式

懒汉式在调用该类的getInstance()方法时才会创建对象实例,因此只有在使用时才会创建对象,避免了资源浪费,但线程不安全。

示例代码:

class Singleton {
private:
    static Singleton* instance;

    Singleton() {}

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

Singleton* Singleton::instance = nullptr;

双检锁/双重校验锁(DCL)

双检锁是指在getInstance()方法中进行双重判断,避免了资源的浪费和线程不安全问题。

示例代码:

class Singleton {
private:
    static Singleton* instance;
    static std::mutex mutex_;

    Singleton() {}

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

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

静态变量

静态变量在程序启动时就创建了对象实例,因此保证线程安全,但是可能会浪费系统资源。

示例代码:

class Singleton {
private:
    Singleton() {}
    static const Singleton instance;

public:
    static const Singleton* getInstance() {
        return &instance;
    }
};

const Singleton Singleton::instance = Singleton();

如何选择合适的实现方式

饿汉式在类加载时就创建对象实例,没有线程安全问题,但可能会浪费一部分系统资源。

懒汉式只有在使用时才创建对象实例,避免了资源浪费,但是有线程不安全问题。

双检锁实现了线程安全,也避免了资源浪费。

静态变量在程序启动时就创建了对象实例,保证线程安全,但是可能会浪费系统资源。

因此,需要根据实际情况选择合适的实现方式。

总结

单例模式是一种常用的设计模式,在需要频繁创建对象、系统只需要一个实例对象、多个实例会导致状态不同步等情况下广泛使用。本文介绍了饿汉式、懒汉式、双检锁和静态变量四种实现方式,并分析了它们的优缺点,希望能够对读者有所帮助。

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

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

相关文章

  • Json格式详解

    Json格式详解 什么是Json? JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于阅读和编写,并易于机器解析和生成。它基于JavaScript语言的一个子集。JSON采用键值对的方式来描述信息,通过大括号{}包围对象,通过方括号[]包围数组。 Json格式规则 数据在名称/值对中 数据由逗号分隔 大括号{}包…

    C 2023年5月23日
    00
  • C语言中形参和实参详解及实例代码

    C语言中形参和实参详解及实例代码 在C语言中,函数定义时会包含一些参数,用于接收调用该函数时传入的实参,在函数体内进行处理。这些参数即为形参。 形参的定义形似变量定义,包含变量类型和变量名,如下所示: int add(int a, int b) { // 函数体 } 其中,形参a和b分别表示传入的两个整数。 在函数调用时,我们需要传递一些值作为实参,实参要与…

    C 2023年5月24日
    00
  • Java如何自定义异常打印非堆栈信息详解

    如何自定义异常打印非堆栈信息 在Java程序中,当代码抛出异常时,异常信息中除了常见的堆栈信息(stack trace)外,还可以自定义异常信息和错误代码等非堆栈信息。这种自定义异常信息可以更加清晰地描述异常情况,便于程序员快速定位和排查问题。下面是一种标准的Java自定义异常的方式,结合代码实例进行说明。 自定义异常示例 在Java中,我们可以通过继承Ex…

    C 2023年5月23日
    00
  • Windows10系统遇到”不能打开要写入的文件”怎么办

    下面是关于“Windows10系统遇到’不能打开要写入的文件’怎么办”的完整攻略,分为以下几个步骤: 1. 检查文件权限 首先,我们需要确认文件是否有正确的权限限制。当一个文件受限时,您可能无法访问它,甚至将其写入到其中。 如何检查文件权限 单击鼠标右键并选择 “属性” 选项 选择 “安全” 标签页并检查是否与您的用户帐户相关联。 如果您有权限,请在相应的区…

    C 2023年5月23日
    00
  • C语言零基础入门(2)

    当学习C语言的时候,需要掌握很多基础知识,掌握这些知识才能正常地写出代码。本文将解释C语言的入门知识。 变量 变量指代内存数据。变量有多个类型,包括整数、浮点数、字符等等。编程时必须考虑变量的类型,这会对程序产生不同的影响。 声明变量 在C语言中,需要先声明一个变量,然后才能使用它,如下所示: int num; float x; char letter; 这…

    C 2023年5月23日
    00
  • 华为揽阅M2平板电脑做工怎么样?华为揽阅M2 10.0指纹平板拆机全过程图解

    华为揽阅M2是一款高性能的平板电脑,其外观和内部设计都十分精细,以下是关于此设备做工的详细分析以及拆机攻略。 华为揽阅M2平板电脑做工分析 外观设计 华为揽阅M2采用了一块10.1英寸的IPS触控屏幕,屏幕分辨率为1920*1200像素,支持10点触控和电磁笔输入。整个设备的外观采用了金属材质,手感舒适,整机重量为约500克。 在机身的四周布置了一些按钮、接…

    C 2023年5月22日
    00
  • C程序 查找两个数组之间的共同数组元素

    下面我将详细介绍如何使用C程序查找两个数组之间的共同数组元素。 题目背景 假设我们有两个整数数组 array1 和 array2,现在需要找出这两个数组之间共同的元素,并输出这些元素。例如: array1 = {1, 3, 5, 7, 9}; array2 = {2, 3, 4, 7, 8}; 则两个数组之间共同的元素是 3 和 7。 解题思路 我们可以使用…

    C 2023年5月9日
    00
  • C语言实现简单学生管理系统

    C语言实现简单学生管理系统攻略 1. 确定需求 在C语言实现简单学生管理系统之前,我们首先需要明确该系统的需求,例如: 能够添加学生信息 能够删除学生信息 能够修改学生信息 能够查询学生信息 能够显示所有学生信息 2. 设计数据库 在明确了系统的需求后,我们需要设计一个合适的数据库来存储学生信息。在我们的例子中,我们可以使用一个结构体来存储学生信息: typ…

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