web设计模式中的单例模式是什么

技术web设计模式中的单例模式是什么本篇内容介绍了“web设计模式中的单例模式是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够

本文介绍了“什么是web设计模式中的单一模式”的知识。很多人在实际案件操作中都会遇到这样的困难。接下来,让边肖带领大家学习如何应对这些情况!希望大家认真阅读,学点东西!

单一模式被广泛使用。例如,我们的控制器和服务都是单例的,但是它不同于标准的单例模式。这种类型的设计模式属于创建模式,它提供了创建对象的最佳方式。这种模式涉及一个单独的类,它负责创建自己的对象,同时确保只创建一个对象。此类提供了一种访问其唯一对象的方法,无需实例化此类的对象即可直接访问该对象。

00-1010单例模式的结构非常简单。它只涉及单例类。这个单例类的构造方法是私有的。类本身定义了一个静态私有实例,并提供了一个静态公共函数来创建或获取静态私有实例。

00-1010单例模式分为懒和饿两种情况;饥饿中国单身族的代码很简单。顾名思义,饿了么中文singleton就是在类初始化的时候创建singleton。示例代码如下:

publicclassSingleton{

privatedstaticlinesingletonsingleton=newSingleton();

//限制多个对象的生成

privateSingleton(){ 0

}

//通过此方法获取实例对象。

publicationstaticongetsingleton(){ 0

returnsingleton

}

//类中的其他方法,尽量静态。

publicationstationvoidsomething(){ 0

}

}但是懒惰的单身者就没那么简单了。当访问这个类的实例时,懒惰的singleton首先判断这个类的实例是否已经创建,如果没有,就需要先创建这个singleton。也就是说,懒单例是在第一次访问时创建的,而不是在初始化阶段。这会导致一个问题。如果在多线程场景中,多个线程同时访问这个实例,并且发现它还没有被创建,那么这些线程将分别创建实例,并且这个单例模式不会如此单一。已经创建了——个实例。在阿里的开发手册中,有两项与偷懒案例相关,告诉我们如何避免这种情况,第6节的第一项和第十二项:

(6)并发处理

1.【强制】获取单例对象时需要保证线程安全,其中的方法也要保证线程安全。

描述:资源驱动类、工具类、单件工厂类都需要注意。

【建议】在并发场景下,采用双重检查锁定,实现最优延迟初始化。

隐患,推荐解决方案。

简单的解决方案(适用于JDK5及以上版本)将目标属性声明为volatile。

反例:

classSingleton{

privateHelperhelper=null

public helper gether(){ 0

if(helper==null)同步(this){ 0

if(helper==null)

helper=newHelper();

}

returnhelper

}

//other methods and field.

} volatile关键字和双重检查锁的功能我之前的博客已经介绍过了,文章地址是https://mp.weixin.qq.com/s/r52hmD71TtiJjlOzQUvRlA.这个博客介绍了一些并发的知识,朋友有空的时候可以看看。这里,volatile关键字用于确保数据的可见性,而双重检查锁用于提高代码性能。下面我们来分析一下手册中的反例:

它的双重检查锁指的是这个代码:

if(helper==null)同步(this){ 0

if(helper==null)

helper=newHelper();不间断空格

;
}

这里如果不用双重检测锁的话只能在整个 getHelper 方法上上锁,因为这个方法必须要保证在并发情况下只有一个线程会执行helper = new Helper(); ,这段代码。也就是说代码 会成为这样:

public synchronized Helper getHelper() {  
		if (helper == null)  {  
			if (helper == null)  
			helper = new Helper();  
		}  
		return helper;  
}

整个方法上锁性能明显是不好的,锁的粒度变大了;双重检查锁里面为什么要做两次 if 判断呢,这个问题留给读者思考,并不是特别难的问题。但是反例里面没有考虑到可见性的问题——假设a线程和b线程同时访问 getHelper 方法,然后 b 线程被阻塞住,a线程发现helper 未被实例化,于是执行new方法,然后释放锁;此时b线程进来,或许我们直观的感受是b线程发现属性被实例化直接返回helper,但实际上不是,当一个线程修改了线程共享的公共资源的时候(此处是helper属性)其他线程未必会被通知到属性被修改,因此b线程有可能发现 helper 还是null 也有可能b线程知道 helper 被赋值了。使用volatile 就可以避免这种情况的发生。因此正确的代码应该是这样的:

class Singleton {  
	private volatile Helper helper = null;  
	public Helper getHelper() {  
		······
	}  
// other methods and fields...  
}

“web设计模式中的单例模式是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/93208.html

(0)

相关推荐

  • visualstudio调试器怎么关闭(visualstudio怎么取消实时调试器)

    技术如何浅析Visual Studio调试中断点的设置本篇文章给大家分享的是有关如何浅析Visual Studio调试中断点的设置,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟

    攻略 2021年12月19日
  • 瓷砖打眼,在瓷砖上面打孔有什么好的办法

    技术瓷砖打眼,在瓷砖上面打孔有什么好的办法在玻化砖上开孔或者打孔的过程中,出现瓷砖开裂是一个比较常见的问题,下面就为大家介绍一下,如何去避免在后期的安装工作中打孔将瓷砖打裂的问题,个人觉得可以从以下几个方面着手: 1、检

    生活 2021年10月22日
  • 脂肪代谢过程,什么状态下人体可以先消耗脂肪

    技术脂肪代谢过程,什么状态下人体可以先消耗脂肪这是减肥的朋友最关心的一个话题,因为每个减肥粉们都想提高减脂效率,让自己尽快的瘦下来。在这里,首先要说明,我们只讨论在运动减肥中”什么状态下先消耗脂肪“,其他什么药物减肥脂肪

    生活 2021年10月24日
  • MYSQL中COLLATE有什么用

    技术MYSQL中COLLATE有什么用这篇文章给大家分享的是有关MYSQL中COLLATE有什么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 MYSQL中的CO

    攻略 2021年10月27日
  • 写朋友深厚友情的诗句,10 形容友谊深厚的诗句

    技术写朋友深厚友情的诗句,10 形容友谊深厚的诗句为什么我首先想到的是孔子的“无友不如已者”……当然,这个观点容易带偏人写朋友深厚友情的诗句。古人:朋友,以义合者 ——朱熹
    近代:在背后称赞我们的人,就是我们的良友。

    生活 2021年10月28日
  • 如何使用php工厂模式

    技术如何使用php工厂模式这篇文章主要介绍“如何使用php工厂模式”,在日常操作中,相信很多人在如何使用php工厂模式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用php工厂模式”

    攻略 2021年10月22日