懒汉式和饿汉式代码,单列模式懒汉和饿汉,C++单例模式的懒汉模式和饿汉模式详解

懒汉式和饿汉式代码,单列模式懒汉和饿汉,C++单例模式的懒汉模式和饿汉模式详解

本文主要详细介绍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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • vs2015打包安装程序,vs2015程序打包,VS2022实现VC++打包生成安装文件图文详细历程
  • vc++6.0的快捷键,vc 快捷键
  • vc++6.0的快捷键,vc 快捷键,VC6.0常用快捷键大全
  • 绘制圆角矩形的方法,c++ 画矩形,C#画圆角矩形的方法
  • 好用的C++编译器,c++编译软件哪个好
  • semaphore c#,c++ semaphore
  • semaphore c#,c++ semaphore,C++中Semaphore内核对象用法实例
  • dev-c++使用教程,dev c++安装教程
  • dev-c++使用教程,dev c++安装教程,Dev C++ 安装及使用方法(图文教程)
  • C里面指针常量和常量指针的区别,c++指针常量和常量指针
  • C里面指针常量和常量指针的区别,c++指针常量和常量指针,简单总结C++中指针常量与常量指针的区别
  • com组件初始化失败,c#开发com组件,C++中COM组件初始化方法实例分析
  • c++静态成员变量使用,c++静态成员函数和静态成员变量
  • c++静态成员变量使用,c++静态成员函数和静态成员变量,详解c++ 静态成员变量
  • c++随机函数rand怎么用,c中rand函数产生的随机数的范围是
  • 留言与评论(共有 条评论)
       
    验证码: