本文主要详细介绍C语言的懒惰模式和饥饿模式。本文中的示例代码非常详细,具有一定的参考价值。感兴趣的朋友可以参考一下,希望能帮到你。
目录
懒惰模式饥饿模式线程安全懒惰模式摘要
懒汉模式
懒惰模式只有在第一次使用类实例时才会被实例化,也就是说,在调用getInstance函数之前,这个类的对象永远不会存在。懒汉本身是线程不安全的。
#包括iostream
使用命名空间std
辛格顿级
私人:
Singelton(){
m _ count
printf(' Singelton begin \ n ');
睡眠(1000);//添加睡眠以放大效果
printf(' singel ton end \ n ');
}
静态Singelton * single//定义指向该实例的唯一指针,并且该指针是私有的
公共:
静态Singelton * GetSingelton();//定义一个公共函数来获取这个唯一的实例。
静态void print();
静态int m _ count
};
//将指向实例的唯一指针初始化为nullptr
Singelton * Singelton:single=nullptr;
int Singelton:m _ count=0;
singel ton * singel ton:getsingel ton(){
If(single==nullptr){//判断是否是第一次使用。
single=新Singelton
}
退单;
}
void Singelton:print(){
coutm _ countendl
}
int main()
{
singleton * a1=singleton:GetInstance();
cout a1 endl
a1-print();
singleton * a2=singleton:GetInstance();
cout a2 endl
a2-print();
系统(“暂停”);
返回0;
}
懒汉模式的singleton类有以下特点:
1.他有一个指向唯一实例的静态指针,并且是私有的。
2.它有一个公共函数,可以获得这个唯一的实例,并在需要时创建它。
3.它的构造函数是私有的,所以你不能从其他地方创建这个类的实例。
饿汉模式
中文模式是在定义singleton类时实例化的(即在main函数之前)。因为全局作用域的类成员的静态变量m_Instance在主函数执行之前已经初始化,所以不存在多线程的问题。
#包括iostream
#包含流程. h
#包含windows.h
使用命名空间std
辛格顿级
私人:
Singelton(){
m _ count
printf(' Singelton begin \ n ');
睡眠(1000);//添加睡眠以放大效果
printf(' singel ton end \ n ');
}
静态Singelton * single//定义指向该实例的唯一指针,并且该指针是私有的
公共:
静态Singelton * GetSingelton();//定义一个公共函数来获取这个唯一的实例。
静态void print();
静态int m _ count
};
//饿汉模式的关键:定义就是实例化。
sing Elton * sing Elton:single=new sing Elton;
int Singelton:m _ count=0;
singel ton * singel ton:getsingel ton(){
//不再需要实例化。
//if(single==nullptr){
//single=new singel ton;
//}
退单;
}
void Singelton:print(){
coutm _ countendl
}
int main()
{
cout '我们得到实例' endl
singleton * a1=singleton:getinstance();
singleton * a2=singleton:getinstance();
singleton * a3=singleton:getinstance();
cout我们销毁实例’endl;
系统(“暂停”);
返回0;
}
线程安全的懒汉模式
在多线程环境下,上面的lazy模式实现是不安全的,因为在判断实例是否为空时,可能会有多个线程同时进入if,此时可能会实例化多个对象。于是双锁的懒惰模式出现了,实现代码如下:
#includeiostream
#includemutex
使用命名空间std
/* singleton模式:将构造函数私有化,提供一个对外的接口*/
//线程安全的单例模式
lhsingleClass类{
公共:
静态lhsingleClass* getinstance()
{//双重锁定模式
if (instance==nullptr)
{//首先判断是否为空,如果为空,则回车,如果不为空,则说明实例已经存在,直接返回。
//进入后锁定
I _ mutex . lock();
if (instance==nullptr)
{//确保不是因为锁定时多个线程同时进入。
instance=new lhsingleClass();
}
i_mutex.unlock()://解锁
}
返回实例;
}
私人的:
静态lhsingleClass*实例;
静态互斥i_mutex://锁
lhsingleClass(){}
}:
lhsingleclass * lhsingleclass:instance=zero tr;
互斥lhsingleclass:I _ mutex;//类外初始化
int main()
{
lhsingleclass * lhsinglep 5=lhsingleclass:getinstance();
lhsingleclass * lhsinglep 6=lhsingleclass:getinstance();
lhsinglep5终层;
lhsinglep6终层;
系统("暂停");
返回0;
}
此代码共进行了两次判断:美元
先判断是否为空,如果为空则进入,不为空说明已经存在实例,直接返回。再判断一次,确保不会因为加锁期间多个线程同时进入。
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。