线程安全的单例模式
Posted 李憨憨_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程安全的单例模式相关的知识,希望对你有一定的参考价值。
单例模式: 非常典型的一种设计模式;
应用场景: 一个类只能实例化一个对象; 一份资源只能被加载一次.
饿汉方式: 资源在程序初始化阶段就完成加载- -以空间换时间;
懒汉方式: 资源在使用的时候再去加载- -延迟加载;
要想实例化多个对象, 共用一份资源, 必须使用static静态成员;
在程序初始化阶段, 进入入口函数之前, 资源就完成初始化;
要实现一个类只能有一个对象: 可以将构造函数私有化;
保证资源只有一份, 并且在程序初始化阶段完成初始化加载;
2.构造函数私有化
实现一个类只能实例化一个对象
保证资源不会在初始化阶段初始化;
2.静态修饰
保证大家访问到的是同一个;
3.volatile修饰
防止编译器过度优化;
4.加锁保护- -线程安全
效率会降低;
5.二次检测
避免锁冲突, 提高效率;
6.构造函数私有化
只实例化一个对象;
应用场景: 一个类只能实例化一个对象; 一份资源只能被加载一次.
单例模式的实现:
饿汉方式/懒汉方式饿汉方式: 资源在程序初始化阶段就完成加载- -以空间换时间;
懒汉方式: 资源在使用的时候再去加载- -延迟加载;
饿汉方式:
要想实例化多个对象, 共用一份资源, 必须使用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.构造函数私有化
只实例化一个对象;
以上是关于线程安全的单例模式的主要内容,如果未能解决你的问题,请参考以下文章