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)

相关推荐

  • 影响mysqld安全的几个选项分别是什么

    技术影响mysqld安全的几个选项分别是什么影响mysqld安全的几个选项分别是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。影响mysqld安全的几个

    攻略 2021年11月17日
  • mairadb+galera+haproxy+keepalived如何实现mysql负载均衡与高可用

    技术mairadb+galera+haproxy+keepalived如何实现mysql负载均衡与高可用这篇文章主要介绍了mairadb+galera+haproxy+keepalived如何实现mysql负载均衡与高可

    攻略 2021年12月8日
  • 增加cacti监控对象时导致数据库出问题怎么办

    技术增加cacti监控对象时导致数据库出问题怎么办这篇文章主要介绍增加cacti监控对象时导致数据库出问题怎么办,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!生产环境:数据库:mysql 5.5.

    攻略 2021年11月23日
  • 友好的英语,“对某人友好”用英语怎么说

    技术友好的英语,“对某人友好”用英语怎么说释义:对…友好/友善She be friendly to everybody. 她对所有的人都友善。2、be nice to sb释义:对某人友好Not exactly, but

    生活 2021年10月26日
  • 中国标志性建筑,中国最具标志性的建筑有哪些

    技术中国标志性建筑,中国最具标志性的建筑有哪些每个国家都拥有一些标志性建筑,一看到它就能唤起对于它的记忆,标志性建筑也是一个国家的名片和象征。要说中国有哪些标志性建筑中国标志性建筑?不同的思考维度有不同的答案,如果从建筑

    生活 2021年10月27日
  • SAP GUI里Screen Painter的工作原理是什么

    技术SAP GUI里Screen Painter的工作原理是什么今天就跟大家聊聊有关SAP GUI里Screen Painter的工作原理是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大

    攻略 2021年12月3日