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)

相关推荐

  • 如何理解Unicode与JavaScript

    技术如何理解Unicode与JavaScript如何理解Unicode与JavaScript,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。上个月,我做了一次

    攻略 2021年11月17日
  • 二寸照片像素,2寸的图片要用多少像素来表示?

    技术二寸照片像素,2寸的图片要用多少像素来表示?相片常用尺寸知识 要达到满意的数码扩印效果二寸照片像素:
    照片规格(英寸) (厘米) (像素) 数码相机类型 1寸 2.5*3.5cm 413*295
    身份证大头照

    生活 2021年10月29日
  • 常用两种mysql数据存储引擎(mysql的存储引擎与数据类型)

    技术MySQL数据库的存储引擎以及常用命令有哪些这篇文章主要介绍了MySQL数据库的存储引擎以及常用命令有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下

    攻略 2021年12月16日
  • sql如何实现jpql排序

    技术sql如何实现jpql排序这篇文章给大家分享的是有关sql如何实现jpql排序的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 jpql按升序排序,并且null要排最后,可以使用COA

    攻略 2021年11月25日
  • 如何进行Mysql索引优化

    技术如何进行Mysql索引优化本篇文章为大家展示了如何进行Mysql索引优化,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。点击上方“程序员小明”,选择“星标”今晚可以不加班! M

    攻略 2021年11月4日
  • centos6.5如何安装jira

    技术centos6.5如何安装jira这篇文章主要为大家展示了“centos6.5如何安装jira”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“centos6.5如何安装ji

    攻略 2021年11月15日