线程安全的单例模式

单例模式: 非常典型的一种设计模式;
应用场景: 一个类只能实例化一个对象; 一份资源只能被加载一次.

单例模式的实现:

饿汉方式/懒汉方式
  饿汉方式: 资源在程序初始化阶段就完成加载- -以空间换时间;
  懒汉方式: 资源在使用的时候再去加载- -延迟加载;

饿汉方式:


要想实例化多个对象, 共用一份资源, 必须使用static静态成员;
在程序初始化阶段, 进入入口函数之前, 资源就完成初始化;
要实现一个类只能有一个对象: 可以将构造函数私有化;
template<class T>
class Singleton{
     
private:
	static T _data;
	Singleton(){
     }
public:
T *GetInstance(){
     
	return &_data;
}
};
1.静态修饰资源
  保证资源只有一份, 并且在程序初始化阶段完成初始化加载;
2.构造函数私有化
  实现一个类只能实例化一个对象

懒汉方式:

template<class T>
class Singleton{
     
private:
	volatile static T *_data;
	static std::mutex _mutex;
public:
	volatile static T *GetInstance(){
     
		if(_data == NULL){
     
			_mutex.lock();
			if(_data == NULL){
     _data = new T();}
			_mutex.unlock();
		}
		return _data;
	}
};
1.定义对象指针
  保证资源不会在初始化阶段初始化;
2.静态修饰
  保证大家访问到的是同一个;
3.volatile修饰
  防止编译器过度优化;
4.加锁保护- -线程安全
  效率会降低;
5.二次检测
  避免锁冲突, 提高效率;
6.构造函数私有化
  只实例化一个对象;

你可能感兴趣的:(Linux)