C++开发之单例模式的实现


前言:主要是介绍饿汉模式和懒汉模式的实现


1.单例模式

  • 所谓单例,就是整个程序有且仅有一个实例。该类负责创建自己的对象,同时确保只有一个对象被创建。
  • 单例模式的作用主要是为了避免创建多个实例,目的是为了产生全局唯一的一个示例。此处的全局表示的是进程内部,多个进程肯定有自己多个实例,因为操作系统按照进程来划分内存。
    • 单例模式分为饿汉模式和懒汉模式,其中饿汉模式用的比较多。

2.饿汉模式

此处使用堆创建的方式演示, 饿汉式属于线程安全。

#include <iostream>
//单例模式 饿汉
using namespace std;

class Student{
    //1构造私有化
    Student() = default;
    //2该类的一个指针. 静态的成员全局唯一.
    static Student *instance;
public:
    //3返回实例
    static Student *getInstance(){
        return instance;
    }
};

//创建实例
Student *Student::instance = new Student();
int main() {
    Student *s1 = Student::getInstance();
    Student *s2 = Student::getInstance();
    cout<<s1<<endl;
    cout<<s2<<endl;
    return 0;
}

在这里插入图片描述

3.普通懒汉模式

懒汉式的意思是: 只有到来获取对象的时候才急忙的去创建对象

#include <iostream>
//单例模式 懒汉
using namespace std;

class Student{
    //1构造私有化
    Student() = default;
    //2该类的一个指针. 静态的成员全局唯一.
    static Student *instance;
public:
    //3返回实例
    static Student *getInstance(){
        if(instance == nullptr){
            instance = new Student();
        }
        return instance;
    }
};

//创建实例
Student *Student::instance = nullptr;
int main() {
    Student *s1 = Student::getInstance();
    Student *s2 = Student::getInstance();
    cout<<s1<<endl;
    cout<<s2<<endl;
    return 0;
}

在这里插入图片描述

4.懒汉模式引发的多线程问题

在多个线程同时并发获取对象的情况下,还是有可能出现创建多实例的情况。

#include<iostream>
#include <mutex>
using namespace std;

class Student {
private:
    static mutex m;
    Student()=default;
    static Student * instance;
public:
    static Student * getInstance() {
        //每次获取实例都要检查锁,效率很低。
        m.lock();
        if (instance == nullptr){
            instance = new Student();
        }
        m.unlock();
        return instance;
    }
};

//静态成员需要在外面初始化。
Student * Student::instance = nullptr;

int main(){
    Student *s1 = Student::getInstance();
    Student *s2 = Student::getInstance();
    cout<<s1<<endl;
    cout<<s2<<endl;
    return 0;
}

5.懒汉模式的双锁检查

对获取实例的函数进行优化,执行双锁检查。

#include <iostream>
#include <mutex>
//单例模式 懒汉
using namespace std;

class Student{
    static mutex m;
    //1构造私有化
    Student() = default;
    //2该类的一个指针. 静态的成员全局唯一.
    static Student *instance;
public:
    //3返回实例
    static Student *getInstance(){
        if(instance == nullptr){
            m.lock();
            if (instance == nullptr){
                instance = new Student();
            }
            m.unlock();
        }
        return instance;
    }
};

//创建实例
Student *Student::instance = nullptr;
int main() {
    Student *s1 = Student::getInstance();
    Student *s2 = Student::getInstance();
    cout<<s1<<endl;
    cout<<s2<<endl;
    return 0;
}


结束!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

等待着冬天的风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值