C++单例实现实践

128 篇文章 0 订阅
65 篇文章 0 订阅
本文详细介绍了C++中实现单例模式的多种方法,包括懒汉模式、线程安全的懒汉模式、双检测锁定以及饿汉模式。每个版本都考虑了线程安全、资源管理和对象初始化时机,旨在确保类只有一个实例并提供全局访问。同时,文章探讨了单例模式在资源管理、线程安全和性能优化方面的最佳实践。
摘要由CSDN通过智能技术生成

简介

  • 保证一个class只有一个实体,并为它提供一个全局访问点。
  • 种经过改进的全局变量。

懒汉模式

版本一

class Singleton 
{
public :
	static Singleton* instance() 
	{
		if (!pInstance_)
			pInstance = new Singleton();
		return pInstance_;
	}
private :
	Singleton(); 		
	Singleton(const Singleton&);
	~Singleton();
private:
	static Singleton* pInstance_;
};

Singleton* Singleton::pInstance_ = nullptr;

版本二

class Singleton 
{
public :
	static Singleton* instance() 
	{
		if (!pInstance_)
			pInstance = new Singleton();
		return pInstance_;
	}
	
	Singleton() = delete;	
	Singleton(const Singleton&) = delete;
	Singleton(Singleton&&) = delete;
	Singleton& operator=(const Singleton&) = delete;
	Singleton& operator=(Singleton&&) = delete;
	~Singleton() = delete;
	
private:
	static Singleton* pInstance_;
};

Singleton* Singleton::pInstance_ = nullptr;

版本三

  • 线程安全
class Singleton 
{
public :
	static Singleton* instance() 
	{
		std::lock_gurad lg(mt);
		if (!pInstance_)
			pInstance = new Singleton();
		return pInstance_;
	}
	
	Singleton() = delete;	
	Singleton(const Singleton&) = delete;
	Singleton(Singleton&&) = delete;
	Singleton& operator=(const Singleton&) = delete;
	Singleton& operator=(Singleton&&) = delete;
	~Singleton() = delete;
	
private:
	static Singleton* pInstance_;
	static std::mutex mt;
};

Singleton* Singleton::pInstance_ = nullptr;
std::mutex Singleton::mt;
  • 双检测锁定
Singleton* Singleton::instance() 
{
	if (!pInstance_)
	{
		std::lock_gurad lg(mt);
		if (!pInstance_)
			pInstance = new Singleton();
	}
	return pInstance_;
}

版本四

class Singleton 
{
public :
	static Singleton& instance() 
	{
		static Singleton inst;
		return inst;
	}
	
	Singleton() = delete;	
	Singleton(const Singleton&) = delete;
	Singleton(Singleton&&) = delete;
	Singleton& operator=(const Singleton&) = delete;
	Singleton& operator=(Singleton&&) = delete;
	~Singleton() = delete;
	
private:
	// ...
};

饿汉模式

class Singleton 
{
public :
	static Singleton& instance() 
	{
		return inst;
	}
	
	Singleton() = delete;	
	Singleton(const Singleton&) = delete;
	Singleton(Singleton&&) = delete;
	Singleton& operator=(const Singleton&) = delete;
	Singleton& operator=(Singleton&&) = delete;
	~Singleton() = delete;
	
private:
	static Singleton inst;
};

Singleton Singleton::inst;

避免资源泄露

Singleton构造函数可以(可能)索求广泛的资源:网络连接、OS互斥体和进程通讯(IPC)方法中的各种 handles、进程外的CORBA或 COM对象的reference,等等。
有效手段:第一次执行才初始化

Singleton& Singleton::instance()
{
	static Singleton obj; // static变量,第一次执行才初始化
	return obj ;
}

优先单例

class Singleton 
{
public :
	static Singleton& instance() 
	{
		static Singleton inst;
		return inst;
	}
	
	Singleton() = delete;	
	Singleton(const Singleton&) = delete;
	Singleton(Singleton&&) = delete;
	Singleton& operator=(const Singleton&) = delete;
	Singleton& operator=(Singleton&&) = delete;
	~Singleton() = delete;
	
private:
	// ...
};

优点:

  • 无线程安全问题
  • 懒汉模式,只要被使用到时才创建对象
  • 局部静态变量,能保证资源得到回收
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值