c++ 实现单例模式 懒汉式,饿汉式

所谓单例模式:

这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

懒汉式:指全局的单例实例在第一次被使用时构建。

#include <iostream>
#include <pthread.h>
#define barrier() __asm__ __volatile__("" ::: "memory")
using namespace std;


class Singleton
{
private:
    static Singleton* pInstance;
    Singleton()
    {
        pthread_mutex_init(&mutex, NULL);
    }
    Singleton(const Singleton&);
    Singleton& operator = (const Singleton&);
    
public:
    static Singleton* getInstance();
    static pthread_mutex_t mutex;
    void print()
    {
        cout << "this = " << this << endl;
    }
};


pthread_mutex_t Singleton::mutex;
Singleton* Singleton::pInstance = NULL;

Singleton* Singleton::getInstance()
{
    //double-check
    if(pInstance == NULL)
    {
        pthread_mutex_lock(&mutex);
        if(pInstance == NULL)
        {
           Singleton* temp = new Singleton;
           
           //此处加了个内存屏障, 运行时,防止多cpu交互导致内存乱序访问
           //保证对象的构造一定在barrier执行之前完成,因此pInstance被赋值时,对象总是完好的
           //在x86_64架构中内核barrier的实现 #define barrier() __asm__ __volatile__("" ::: "memory")
           barrier();
           
           pInstance = temp;
        }
        pthread_mutex_unlock(&mutex);
    }
    
    return pInstance;
}

int main()
{
    Singleton* s1 = Singleton::getInstance();
    Singleton* s2 = Singleton::getInstance();
    
    s1->print();
    s2->print();
    
    return 0;
}

饿汉式:指全局的单例实例在类装载时构建。

#include <iostream>
using namespace std;

class Singleton
{
private:
    static Singleton* pInstance;
    Singleton()
    {
        
    }
    Singleton(const Singleton&);
    Singleton& operator = (const Singleton&);
    
public:
    static Singleton* getInstance();
    void print()
    {
        cout << "this = " << this << endl;
    }
};

Singleton* Singleton::pInstance = new Singleton;

Singleton* Singleton::getInstance()
{
    return pInstance;
}

int main()
{
    Singleton* s1 = Singleton::getInstance();
    Singleton* s2 = Singleton::getInstance();
    
    s1->print();
    s2->print();
    
    return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值