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)

相关推荐

  • 误删数据库数据后的处理方法有哪些

    技术误删数据库数据后的处理方法有哪些本篇内容介绍了“误删数据库数据后的处理方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够

    攻略 2021年11月5日
  • 狡猾的狐狸是什么歌,狡猾的狐狸是指什么意思

    技术狡猾的狐狸是什么歌,狡猾的狐狸是指什么意思不论在哪个国家狡猾的狐狸是什么歌、哪个民族,狐狸都是狡猾、奸诈、贪婪的形象。人们没有冤枉它,狐狸生来多疑,诡计多端。如果狐狸遭到猎人的枪击,没被击中,它会采取装死的办法,将身

    生活 2021年10月20日
  • 樱花几月开的最旺盛,樱花是几月开花到几月谢呢

    技术樱花几月开的最旺盛,樱花是几月开花到几月谢呢樱花的花期一般在3-4月樱花几月开的最旺盛,受气候条件影响,会略有波动,一般在四月初最为繁盛,花期不长,一般10-15天。 樱花(学名:Cerasus sp.):是蔷薇科樱

    生活 2021年11月1日
  • 元宇宙的定义是什么

    技术元宇宙的定义是什么这篇文章主要讲解了“元宇宙的定义是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“元宇宙的定义是什么”吧! 元宇宙的定

    攻略 2021年11月2日
  • 游说的读音,一直想收个高级的游说之舌的巨蜥

    技术游说的读音,一直想收个高级的游说之舌的巨蜥我们华山有把如意以下所有的技能都研发出来的帮派,想体验游说来华山,呵呵现在的问道是罩子和如意圈的天下.光把这三种研究完就很困难了游说的读音,谁还愿意花精力,金钱去研究游说之舌

    生活 2021年10月22日
  • asmdisk对应的磁盘分区信息是什么

    技术asmdisk对应的磁盘分区信息是什么这篇文章主要介绍了asmdisk对应的磁盘分区信息是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

    攻略 2021年11月12日