zoukankan      html  css  js  c++  java
  • 三种单例模式的实现(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()
        {
    
        }
    };
  • 相关阅读:
    [转]vim 退格键(backspace)不能用
    centos出现“FirewallD is not running”怎么办
    cordova 实现拨打电话-只需两步(H5)
    腾讯云上运行java程序过程
    centos7 安装php
    centos 7 PostgreSQL一些简单问题以及解决办法
    centos 安装 java
    git push报错error: failed to push some refs to 'git@github.com:
    linux install beanstalkd
    centos7 执行一个数据库脚本创建项目中的数据库
  • 原文地址:https://www.cnblogs.com/JsonZhangAA/p/14852209.html
Copyright © 2011-2022 走看看