欢迎来到这里

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

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

1.单例模式

2.饿汉模式

3.普通懒汉模式

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

5.懒汉模式的双锁检查

 

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

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;

}

 

赞这个主题
1,048
用户 liu 发布于
Jan 8, 2024 5:40:08 AM
用户 liu 最后回复于
Jan 8, 2024 5:40:08 AM

评论区

添加评论
搜索
作者

测试人员

BBS 一直在, 一感谢支持!
2023 测试内容
作者热门主题

预留信息

Nepoch
简单、易用、开放
一个综合性开放论坛
1
用户数
10
发帖数
手机可见,内容正在编写中,pc端可正常访问