单例设计模式共享数据分析、解决

本文详细探讨了设计模式中的单例模式,分析了不同类型的单例实现,包括线程不安全的懒汉式、线程安全的加锁懒汉式、C++11的内部静态变量懒汉单例以及线程安全的饿汉式。同时,介绍了C++11的`call_once()`函数在确保函数仅执行一次的场景下,如何实现线程安全且高效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.设计模式大概谈

“设计模式”:代码的一些写法(这些写法跟常规写法不怎么一样):程序灵活,维护起来可能很方便,但是别人接管、阅读代码都会很痛苦。

用“设计模式”理念写出的代码很晦涩的。《head first》讲设计模式,可以了解一下。

老外为应付特别大的项目的时候,把项目的开发经验、模块划分经验,总结整理成设计模式(先有开发需求,后又理论总结和整理)

设计模式拿到中国来,不太一样,拿着一个程序(项目)往设计模式上套,一个小小的项目它非要弄几个设计模式进去,本末倒置。

设计模式肯定有它独特的优点,要活学活用,不要深陷其中,生搬硬套。

二.单例设计模式

使用频率比较高。
单例:整个项目中,某个或者某些特殊的类,属于该类的对象,只能创建一个,多了创建不了。
建议:一般在主线程中先实例出一个对象,之后在子线程中可以去使用这个对象,若在子线程中取实例,容易出现线程不安全的情况。
单例模式分类:

  • 懒汉式:指系统运行中,实例并不存在,只有当需要使用该实例时,才会去创建并使用实例。(这种方式要考虑线程安全)
  • 饿汉式:指系统一运行,就初始化创建实例,当需要时,直接调用即可。(本身就线程安全,没有多线程的问题)
1.普通懒汉式单例(线程不安全)

注意类中套类的写法,来释放掉创建的实例。

#include <bits/stdc++.h>
#include <thread>
#include <mutex>
using namespace std;

class Singleton{
   
    private:
    Singleton(){
   }//私有化构造函数
    //进制外部拷贝和赋值
    Singleton(const Singleton&);
    Singleton operator=(Singleton&);
    static Singleton *m_instance; //静态成员变量

    public:
    static Singleton* getInstance(){
   
        if(m_instance == nullptr){
   
            m_instance = new Singleton(); // 没有加锁是线程不安全的,当线程并发时会创建多个实例
            static deleteInstance c1; //这是静态成员,当程序结束的时候,会调用该对象的析构函数。
        }
        return m_instance;
    }
    /*
    //需要手动释放
    void deleteInstance(){
        if(m_instance){
            delete m_instance;
            m_instance = nullptr;
        }
    }
    */
    class deleteInstance{
    //类中套类,用来释放对象。不需要手动释放
        public:
        ~deleteInstance(){
   
            if(Singleton::m_instance){
   
                delete Singleton::m_instance;
                Singleton::m_instance = nullptr;
            }
        }
    };
    void func(){
   
        cout<<"测试"<<endl;
    }
};
//类静态变量初始化
Singleton* Singleton::m_instance = nullptr;

int main(){
   
    Singleton* p = Singleton::getInstance();
    p->func();
    return 0;
}  
2.加锁的懒汉式单例(线程安全)

使用了双检锁,提高效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值