本文介绍了“什么是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