• 三种单例模式的实现(C++)


      今天主要是学习了单例模式的三种实现,包括懒汉式、双重检查锁懒汉式和饿汉式。

      首先,我们应该要理解单例模式的概念,单例模式简单的来说就是一个类只允许有一个对象,为此,我们可以知道必须要控制类的构造行为,故将构造函数私有化、同时将该类的对象

    定义为该类的静态数据成员(因为构造函数被私有化了)。

    1.   首先是懒汉式,懒汉式理解起来最为直接,直接上代码

      

    #include "commonHeader.h"
    
    class lanhan {
    public:
        static lanhan * getInstance()
        {
            if (nullptr == instance)
            {
                instance = new lanhan();
            }
            return instance;
        }
    private:
        lanhan()
        {
    
        }
        static lanhan * instance;
    };
    
    lanhan * lanhan::instance = nullptr;

      通过每次去判断instance是否为空,从而保证instace只会被初始化一次,但是这种保证只在单线程的情况下成立,当多个线程都对instace==nullptr进行判断时,instance无疑

    还是会被执行多次。

      2. 考虑到懒汉式在多线程下存在的问题,于是也有人提出了使用互斥锁来保证这一点,代码如下:

      

    #include <mutex>
    #include "commonHeader.h"
    
    class lanhanPlus
    {
    public:
        static lanhanPlus * getInstance()
        {
            if (nullptr == instance)
            {
                helpLock.lock();
                if (nullptr == instance)
                {
                    instance = new lanhanPlus();
                }
                helpLock.unlock();
            }
            return instance;
        }
    private:
        lanhanPlus()
        {
    
        }
        static lanhanPlus * instance;
        static mutex helpLock;
    };
    
    lanhanPlus * lanhanPlus::instance = nullptr;
    mutex lanhanPlus::helpLock;

      通过借助互斥锁的帮助,懒汉式在多线程环境下也能保证类达到单例的要求。同时这里通过两层判空的设定,不会对程序的性能造成太多的影响。

      3. 饿汉式,饿汉式非常巧妙的借助了静态局部变量的特性,存储在静态区,作用域局部,只会在第一次定义时被初始化,非常完美,代码如下:

      

    #include "commonHeader.h"
    
    class ehan
    {
    public:
        static ehan * getInstance()
        {
            static ehan * instance;
            return instance;
        }
    private:
        ehan()
        {
    
        }
    };
  • 相关阅读:
    mybatis逆向工程使用
    shiro凭证配置
    shiro基于ini文件入门案例
    springboot实现自定义mvc组件
    ssm整合activiti配置文件和依赖
    activiti网关分支设置
    HTML5新特性 websocket(重点)--多对多聊天室
    HTML5新特性--svg-echarts(重点)-拖动API-WebWorker
    HTML5新特性-- -定时器
    HTML新特性--canvas绘图-文本
  • 原文地址:https://www.cnblogs.com/JsonZhangAA/p/14852209.html
Copyright © 2020-2023  润新知