博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式之(Singleton)模式的几种实现
阅读量:5784 次
发布时间:2019-06-18

本文共 1962 字,大约阅读时间需要 6 分钟。

第一种:低效率实现

这种实现方法,优点是实现简单,缺点是在多线程频繁访问下效率比较低,经常出现锁竞争。适应于不需要频繁访问实例的情况下。

class Singleton{public:    static Singleton* GetInstance()    {        AutoLock lock(mutex);        if (!m_instance)            m_instance = new Singleton;        return m_instance;    }private:    Singleton(){};    Singleton(const Singleton &);    Singleton & operator =(const Singleton &);    static Singleton *m_instance;    static Mutex m_mutex;}

第二种:两次检查实例指针

这种实现方法相对与第一种效率要高,只要未实例化的情况下进行加锁,但是代码看起来不够简洁,需要两次检查实例指针是否为空。适用于需要频繁获取实例的情况下。

class Singleton{public:    static Singleton* GetInstance()    {            if (!m_instance)        {            AutoLock lock(mutex);            if (!m_instance)                m_instance = new Singleton;        }        return m_instance;    }private:    Singleton(){};    Singleton(const Singleton &);    Singleton & operator =(const Singleton &);    static Singleton *m_instance;    static Mutex m_mutex;}Mutex Singleton::m_mutex;Singleton* Singleton::m_instance = NULL;

第三种:程序启动时即初始化

这种实现方法,相对于前面两种都要简单,缺点是程序一启动便在堆上分配实例,不管有没有客户调用。适用于程序中确定肯定会使用到该实例的情况。

class Singleton{public:    static Singleton* GetInstance()    {        return m_instance;    }private:    Singleton(){};    Singleton(const Singleton &);    Singleton & operator = (const Singleton &);    static Singleton *m_instance;    static Mutex m_mutex;}Mutex Singleton::m_mutex;Singleton* Singleton::m_instance = new Singleton;

 

第四种:线程一次性初始化

按陈硕提出的使用Linux下phtread_once线程函数实现,该线程函数的回调在程序的生命周期只会执行一次,利用该线程函数的回调实现初始化,比上面提到的任何一种方法都要高效,而且代码简洁。缺点是不能跨平台。

class Singleton{public:    static Singleton* GetInstance()    {        phtread_once(&ponce, &Singleton::Init);        return m_instance;    }private:    void Singleton():m_instance(NULL){};    static void Init()    {        m_instance = new Singleton;    }    static Singleton *m_instance;    static pthread_once_t ponce;}Singleton* Singleton::m_instance = NULL;pthread_once_t Singleton::ponce;

转载于:https://www.cnblogs.com/key000/p/4109144.html

你可能感兴趣的文章
利用rand7()构造rand10()
查看>>
MySQL 备份与恢复
查看>>
吃午饭前,按书上的代码写会儿--Hunt the Wumpus第一个版本
查看>>
easyui中combobox的值改变onchang事件
查看>>
Eclipse魔法堂:任务管理器
查看>>
一周自学动态站点设计
查看>>
eclipse中查看某个方法(函数)被谁调用
查看>>
poj万人题
查看>>
Android-Universal-Image-Loader
查看>>
Java从零开始学四(数据类型)
查看>>
Android 从硬件到应用:一步一步向上爬 4 -- 使用 JNI 方法调硬件驱动
查看>>
windows 如何查看端口占用情况?
查看>>
根据ImageView的大小来压缩Bitmap,避免OOM
查看>>
TEST
查看>>
loadrunner 的Administration Page里面设置
查看>>
程序员喜欢怎样的职位描述?(转)
查看>>
威胁快报|ProtonMiner挖矿蠕虫扩大攻击面,加速传播
查看>>
<<深入PHP面向对象、模式与实践>>读书笔记:面向对象设计和过程式编程
查看>>
架构的“一小步”,业务的一大步
查看>>
聊聊flink JobManager的heap大小设置
查看>>