c++单例模式

1.什么是单例模式?

单例模式是指在内存中只会创建且仅创建一次对象的设计模式。

2.单例模式分两种

饿汉模式,懒汉模式。

一个好的单例模式需要具备四种条件:全局只有一个实例:static 特性,禁止用户自己声明并定义实例(构造函数设为private);线程安全;禁止拷贝和赋值;使用static类成员函数(用户通过接口获取实例)。

(1).饿汉模式

在类加载时已经创建好该单例对象,等待被程序使用

代码实现

class Single {
private:
	Single() {}
	Single(const Single&) = delete;
	Single& operator=(const Single&) = delete;
	static Single* s = new Single();
public:
	~Single(){}
	static Single* GetSingle() {
		return s;
	}
};

(2).懒汉模式

在真正需要使用对象时才去创建该单例类对象

代码实现

class Single {
private:
	Single() {}
	Single(const Single&) = delete;
	Single& operator=(const Single&) = delete;
	static Single* s;
public:
	~Single(){}
	static Single* GetSingle() {
		if (s == nullptr) {
			s = new Single();
		}
        return s;
	}
};

3. 懒汉模式的存在的问题

(1).会出现多线程竞争问题(线程安全问题,加锁解决)

(2).还会出现内存泄露(用智能指针解决)

4.懒汉模式解决线程安全问题最好的办法:设置局部静态变量

如果当变量在初始化的时候,并发同时进入声明语句,并发线程将会阻塞等待初始化结束。

这样保证了并发线程在获取静态局部变量的时候一定是初始化过的,所以具有线程安全性。

代码实现


class CSingleton
{  
public:  
    ~ CSingleton(){};
     CSingleton(const  CSingleton&)=delete;
    CSingleton& operator=(const CSingleton&)=delete;
    static CSingleton & GetInstance()
        {
            static CSingleton _instance;
            return _instance;
        }
private:  
 CSingleton(){};
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值