线程安全的单例模式

Posted 李憨憨_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程安全的单例模式相关的知识,希望对你有一定的参考价值。

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

单例模式的实现:

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

饿汉方式:


要想实例化多个对象, 共用一份资源, 必须使用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.构造函数私有化
  只实例化一个对象;

以上是关于线程安全的单例模式的主要内容,如果未能解决你的问题,请参考以下文章

C# 两行代码实现 延迟加载的单例模式(线程安全)

C++ 线程安全的单例模式总结

线程安全的单例模式

Java线程安全的单例模式的几种实现

多线程 实现单例模式 ( 饿汉懒汉 ) 实现线程安全的单例模式 (双重效验锁)

java 实现线程安全的单例模式