码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式之(Singleton)模式的几种实现

时间:2014-11-19 21:57:09      阅读:233      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   使用   sp   on   div   log   代码   

第一种:低效率实现

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

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;

设计模式之(Singleton)模式的几种实现

标签:style   blog   color   使用   sp   on   div   log   代码   

原文地址:http://www.cnblogs.com/key000/p/4109128.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!