单例模式:懒汉式和饿汉式

这篇具有很好参考价值的文章主要介绍了单例模式:懒汉式和饿汉式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

懒汉模式和饿汉模式

区别

示例

懒汉模式线程不安全

懒汉模式线程安全

 懒汉模式内部静态变量线程安全

饿汉式线程安全


指的是在系统生命周期内,只产生一个实例。

懒汉模式和饿汉模式

分为懒汉式饿汉式

区别

  • 创建时机和线程安全

线程安全:多线程共享资源的过程中,线程安全通过同步机制保证各个线程正确执行。

懒汉式,比较懒,只有在用到的时候才去想我怎么才能用到,所以只有当要用到该对象时才去创建实例。线程不安全

原因:懒汉式的实例是在使用的时候才去申请,这个时候如果还没有new 出来实例,恰好又有多个线程进来访问创建对象的话,就会有问题。

解决方法:加锁。

饿汉式,害怕自己饿着,所以在一开始就准备好自己需要的东西。所以是一运行程序,就创建实例。在线程还未创建之前就已经创建出了实例,所以一定是线程安全的。

  • 执行效率

懒汉式,为保证线程安全,需要加同步锁,所以执行比饿汉式要慢一些。

  • 内存使用

懒汉式,在需要的时候才去创建实例对象,不浪费内存;

饿汉式,一开始就去创建,会占据空间,浪费内存。

示例

懒汉模式线程不安全

//懒汉模式:线程不安全
SingleCase * SingleCase::m_SingleCase = NULL;

SingleCase * SingleCase::GetInstance()
{
	if (m_SingleCase == NULL)
	{
		m_SingleCase = new SingleCase();
	}
	return m_SingleCase;
}

创建5个线程,运行结果:

构造了三次,线程不安全,适合单线程使用

单例模式:懒汉式和饿汉式,设计模式,单例模式,开发语言,c++

注:可以将构造、析构、拷贝赋值和拷贝构造都改为private,禁止其他类进行操作。

懒汉模式线程安全

//懒汉模式,线程安全
SingleCase * SingleCase::m_SingleCase = NULL;
std::mutex SingleCase::m_mutex;
SingleCase * SingleCase::GetInstance()
{
	if(m_SingleCase == NULL)
	{
        //双检锁
		//假如线程1和线程2同时到达
		m_mutex.lock();
		//此时线程1进入,判断m_SingleCase为空
		if (m_SingleCase == NULL)
		{
			//实例化对象
			m_SingleCase = new SingleCase();
		}
		//结束后,释放锁,此时线程2进入,m_SingleCase已经被实例化,可以避免多次实例
		m_mutex.unlock();
	}
	
	return m_SingleCase;
}

双检锁

1.第一层if判断,完成实例化之后,之后的线程不需要进入等待,提高了效率;

2.第二层if判断,防止对象被多次实例化。

运行结果:

单例模式:懒汉式和饿汉式,设计模式,单例模式,开发语言,c++

懒汉模式内部静态变量线程安全

//懒汉模式内部静态
SingleCase & SingleCase::GetInstance()
{
	static SingleCase single;
	return single;
}

运行结果:

单例模式:懒汉式和饿汉式,设计模式,单例模式,开发语言,c++

饿汉式线程安全

SingleCase * SingleCase::m_SingleCase = new SingleCase();
SingleCase * SingleCase::GetInstance()
{
	return m_SingleCase;
}

运行结果:

单例模式:懒汉式和饿汉式,设计模式,单例模式,开发语言,c++文章来源地址https://www.toymoban.com/news/detail-564937.html

到了这里,关于单例模式:懒汉式和饿汉式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java|多线程与高并发】设计模式-单例模式(饿汉式,懒汉式和静态内部类)

    设计模式是一种在软件开发中常用的解决复杂问题的方法论。它提供了一套经过验证的解决方案,用于解决特定类型问题的设计和实现。设计模式可以帮助开发人员提高代码的可重用性、可维护性和可扩展性。 设计模式有很多,本文主要介绍单例模式. 单例模式是一种创建型设

    2024年02月11日
    浏览(54)
  • 设计模式第一课-单例模式(懒汉模式和饿汉模式)

    个人理解:单例模式实际就是通过类加载的方式获取到一个对象,并且保证这个对象在使用中只有一个,不允许再次被创建 1、懒汉模式的基础写法 代码解释: (1)、编写LazySingleton类的时候,需要将成员属性设定为static,这样才会是类属性 (2)、重写构造方法,将其设置

    2024年02月05日
    浏览(43)
  • 24种设计模式之单例模式(饿汉式、懒汉式)

    单例模式( Singleton Pattern )是指确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点。单例模式是创建型模式。单例模式在现实生活中应用也非常广泛,例如,总统,班主任等。J2EE标准中的ServletContext 、ServletContextConfig 等、Spring框架应用中的。 特点:构造方

    2024年02月07日
    浏览(47)
  • Java中单例(单态、原子)设计模式(饿汉式/懒汉式)

    先看文章目录,大致了解知识点结构,直接点击文章目录可以跳转到文章指定位置。 设计模式就是设计出来的固定问题的解决方法,描述了在软件设计过程中的一些不断重复发生的问题和解决方案。遇到类似问题的时候可以直接使用现成的模式方案。 ①单例模式中一个类只

    2024年02月04日
    浏览(42)
  • 【多线程案例】单例模式(懒汉模式和饿汉模式)

    提起单例模式,就必须介绍设计模式,而设计模式就是在软件设计中,针对特殊问题提出的解决方案。它是多年来针对一些常见的问题的解决方法,具有良好的可复用性、可扩展性和可维护性。 标准的设计模式有23种,单例模式就是最常见的一种,其目的是确认一个类只有一

    2024年02月10日
    浏览(45)
  • 【单例模式】饿汉式、懒汉式、静态内部类--简单例子

    单例模式是⼀个单例类在任何情况下都只存在⼀个实例,构造⽅法必须是私有的、由⾃⼰创建⼀个静态变量存储实例,对外提供⼀个静态公有⽅法获取实例。 目录 一、单例模式 饿汉式  静态内部类 懒汉式 反射可以破坏单例 道高一尺魔高一丈 枚举 类⼀加载就创建对象,这

    2024年04月23日
    浏览(64)
  • c++单例模式包括懒汉模式和饿汉模式(优劣势分析和改进方法)

    在整个软件的运行过程中,让整个类有且只有一个实例化对象存在于整个进程中。 是最简单的一个设计模式,然后再项目开发中也是使用最广的。 1.节省资源:再整个软件的运行过程中,只有一个实例化对象,不用重新分配新的堆空间。 2.数据的传递:由于单例只会创建一个

    2024年02月21日
    浏览(39)
  • Java单例模式的五种实现方式 懒汉式 饿汉式 双重校验锁 静态变量 静态内部类 枚举实现单例模式等

    Java单例模式是一种设计模式,用于确保一个类只有一个实例,并提供全局访问点以获取该实例。它通常用于需要共享资源或控制某些共享状态的情况下。 懒汉式:在类加载的时候就创建对象,要再调用方法时才创建对象,减少内存开销。 饿汉式:再类加载的时候就实例化对

    2024年04月27日
    浏览(36)
  • 【Java中23种设计模式-单例模式--饿汉式】

    加油,新时代打工人! 简单粗暴,直接上代码。 23种设计模式定义介绍 Java中23种设计模式-单例模式 Java中23种设计模式-单例模式2–懒汉式线程不安全 Java中23种设计模式-单例模式2–懒汉式2线程安全

    2024年02月22日
    浏览(49)
  • 设计模式之单例模式(懒汉, 饿汉)

    单例模式是一种常用的软件设计模式, 该模式的主要目的是确保某一个类在内存中只能有一个实例对象, 通过单例模式的方法创建的类在当前进程中只有一个实例对象. 常见的单例模式有两种: 饿汉式, 这里的 “饿” 意义表述不够清晰, 用 “急” 来表述意义更加容易联想一些

    2024年02月22日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包