首页 > 其他分享 >单例模式

单例模式

时间:2022-11-29 21:24:34浏览次数:29  
标签:Singelton 变量 模式 线程 单例 多线程 构造函数

1.单例模式简介

   (1)多线程模式下,共享同一个资源或者操作同一个资源,单例模式保证一个类只生成唯一的一个对象

            例如:多个线程使用同一个socket资源;配置文件的读取时。

   (2)实现单例步骤常用步骤:

           a) 构造函数私有化            b) 提供一个全局的静态方法(全局访问点)            c) 在类中定义一个静态指针,指向本类的变量的静态变量指针

2. 饿汉式单例(多线程下没问题)

         不管用不用,main函数之前就已经把这个实例给创建出来了

#include <iostream>
using namespace std;

class Singelton
{
private:
    Singelton()                     //第1步:构造函数的私有化
    {
        m_singer = NULL;
        m_count = 0;
        cout << "构造函数 Singelton ... do" << endl;
    }
public:
    static Singelton *getInstance()  //第2步:提供一个全局的静态方法(全局访问点)
    {
        return m_singer;
    }
    static void FreeInstance()
    {
        if (m_singer != NULL)
        {
            delete m_singer;
            m_singer = NULL;
            m_count = 0;
        }
    }
private:
    static Singelton *m_singer;      //第3步:在类中定义一个静态指针,指向本类的变量的静态变量指针
    static int m_count;
};
Singelton *Singelton::m_singer = new Singelton;   //饿汉式单例的关键点:不管你创建不创建实例,均把实例new出来
int Singelton::m_count = 0;

int main()
{
    cout << "演示 饿汉式" << endl;
    Singelton *p1 = Singelton::getInstance();
    Singelton *p2 = Singelton::getInstance();
    if (p1 != p2)
    {
        cout << "不是同一个对象" << endl;
    }
    else
    {
        cout << "是同一个对象" << endl;      //结果是同一个对象
    }
    Singelton::FreeInstance();
    Singelton::FreeInstance();
}

3. 懒汉式单例(多线程下需进行同步,本案例采用Double-Checked Locking 优化)

     (1)使用的时候,才会去创建对象
     (2)多线程中会导致多个实例的产生,从而导致运行代码不正确以及内存的泄露。
                原因: C++中构造函数并不是线程安全的,C++中的构造函数简单来说分两步:                              第一步:内存分配                          第二步:初始化成员变量                      由于多线程的关系,可能当我们在分配内存好了以后,还没来得急初始化成员变量,就进行线程切换。                      另外一个线程拿到所有权后,由于内存已经分配了,但是变量初始化还没进行,因此打印成员变量的相关值会发生不一致现象。
 1 #include <iostream>
 2 #include <QMutex>
 3 using namespace std;
 4 
 5 //互斥锁
 6 static QMutex mutex;
 7 class Singleton
 8 {
 9 private:
10     Singleton()              //第1步:构造函数私有化
11     {
12         m_singer = NULL;
13         m_count = 0;
14         cout << "构造函数 Singelton ... do" << endl;
15     }
16     //防止拷贝构造和赋值操作
17     Singleton(const Singleton &){;};
18     Singleton& operator = (const Singleton &){;};
19 public:
20     static Singleton *getInstance()      //第2步:提供一个全局的静态方法(全局访问点)
21     {
22         if(m_singer == NULL)   //double check
23         {
24             mutex.Lock();
25             //二次检查很重要,防止重复创建,比如第1个线程和第2线程都在mutex.Lock()等着;
26             //第一个线程创建完了,第二个线程再往下走时不判断为空就会重复创建了.
27             if(m_singer == NULL)
28             {
29                 m_singer = new Singleton();
30             }
31             mutex.Unlock();
32         }
33         return m_singer;
34     }
35 private:
36     static Singleton *m_singer;   //第3步:在类中定义一个静态指针,指向本类的变量的静态变量指针
37     static int m_count;
38 };
39 
40 Singleton *Singleton::m_singer = NULL;   //懒汉式 并没有创建单例对象
41 int Singleton::m_count = 0;

 

 

标签:Singelton,变量,模式,线程,单例,多线程,构造函数
From: https://www.cnblogs.com/dkhlaojogo/p/16936572.html

相关文章

  • 策略模式
    风带着万物全部飘散,可那飘散的不是万物,而是我的青春一个简单的鸭子应用使用简单继承的模式实现多个不同的鸭子实现类。新需求-鸭子能飞现在公司为了甩开其他竞争......
  • 设计模式之解释器模式
    文法规则和抽象语法树解释器模式描述了如何为简单的语言定义一个文法,如何在该语言中表示一个句子,以及如何解释这些句子。在正式分析解释器模式结构之前,先来学习如何表示一......
  • (十六)状态模式
    1概述状态模式(State),当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的......
  • C#设计模式读书笔记之设计模式的设计原则
    设计模式的设计原则:(重要性从上往下排列)开闭原则:对扩展开放,对修改关闭依赖倒转原则:高层模块不应该依赖底层模块,它们都应该依赖抽象;要针对抽象层编程,而不要针对具体类编程。......
  • Docker使用Calico网络模式配置及问题处理
    一.Calico介绍Calico是一种容器之间互通的网络方案,在虚拟化平台中,比如OpenStack、Docker等都需要实现workloads之间互连,但同时也需要对容器做隔离控制,就像在Internet中的......
  • 安卓设计模式演变之经典三层模型(MVC/MVP/MVVM)
    转载请标明出处!先看代码demo再回看文章效果最佳!目录​​一mvc​​​​1.1概述​​​​1.2 作用流程​​​​1.3 现状​​​​1.4致命弱点/缺点:​​​​1.5 代码Demo​......
  • Java内功修炼系列:代理模式及动态代理
    目录​​一代理模式​​​​1.1简介​​​​1.2代理模式角色定义​​​​二静态代理​​​​2.1介绍和实例​​​​2.2静态代理的缺点​​​​三动态代理​​​​3.1......
  • 如何解决win10系统睡眠模式及断网的情况?
    由于测试需求,所以临时在win10上面搭建了一套web系统。但是发现了一个大问题,每隔一段时间,网络就不通了。后面发现原来是系统自动休眠把网卡关闭了。解决方法如下:1.禁止关闭网......
  • 备忘录模式
    大家有没有看过尼古拉斯凯奇主演过的《NEXT》(《预见未来》)?尼古拉斯凯奇饰演一个可以预视并且扭转未来的人,其中一个情节很是让人心动——男女主角见面的那段情节:。。。。。。......
  • 河北稳控科技VM系列振弦采集读数模块的测量模式
    河北稳控科技VM系列振弦采集读数模块的测量模式 模块有连续测量和单次测量两种测量模式,通过向测量模式寄存器WKMOD.[0]写入1使模块工作于连续测量工作模式,写入0......