乐天堂FUN88
你的位置:乐天堂FUN88_Fun88乐天堂app官网 > 乐天堂FUN88产品中心 > 乐天堂FUN88 单例模式的十种写法,你会几个?

乐天堂FUN88 单例模式的十种写法,你会几个?

时间:2022-06-14 11:44 点击:72 次

一、单例模式的先容乐天堂FUN88

单例模式的勤苦点在于两个,一个是在哪些场地使用到了单例模式,一个是单例模式如何写。之前只计划到了如何写,然而哪些场地使用到了,表述的不是很明晰。这一次我找了几个骨子例子。

意见:单例模式确保某个类只须一个实例。

有一个平淡的领路,那等于在古代,寰宇就一个天子。如何确保一个天子?这等于单例模式。

先看如何写,然后再看在哪用。

二、单例模式的各式写法

1、懒汉式:基本写法

懒汉式等于什么时候用,什么时候创建类的实例。

publicclassSingleton{privateSingleton{}//构造法度privatestaticSingletonsingle=null;publicstaticSingletongetInstance{if(single==null){single=newSingleton;}returnsingle;}}

特质:

(1)线程不安全(并发时可能出现多个单例)

(2)构造法度为private,收尾了外部只可从getInstance去赢得单例

(3)使用static重要字,标明全局只须一份量入制出了资源,然而如果单例对象相比复杂,new时就相比耗本事。这极少要防备。

上头最主要的曲折等于线程不安全,因此想要措置这个问题,只需要对法度加锁即可。

2、懒汉式:使用synchronized同步

publicclassSingleton{privatestaticSingletoninstance;privateSingleton{}publicstaticsynchronizedSingletongetInstance{if(instance==null){instance=newSingleton;}returninstance;}}

特质:

(1)此时线程安全

(2)因为加了锁,此时如果单例对象复杂,不仅耗内存,而况new的本事更长,成果更低。

然而上头这种成果不高还有另外一个原因。一个线程过来想要创建单例,率先要进行synchronized锁判断,接下来判断单例是否为空,如果为空,那就创建单例。

既然上头每个线程过来都需要锁判断和单例是否为空的判断,这么做有点耗时,毕竟锁判断是相比耗时的。

3、懒汉式:双重查验锁定

为了措置上头的这个问题,才有了双重查验锁定。

publicclassSingleton{privatestaticSingletoninstance;privateSingleton{}publicstaticSingletongetInstance{//第一次查验if(singleton==null){synchronized(Singleton.class){//第二次查验if(singleton==null){singleton=newSingleton;}}}returnsingleton;}

特质:

(1)线程安全

(2)耗内存,而况单例对象相比复杂,相比耗时,然而对单重锁成果普及不少。

此时为了减少锁的判断量,只需要对单例进行判断即可,如果不为空径直复返,如果为空,那就创建新的单例。

4、饿汉式:基本写法(instance为private)

恶汉式是一脱手就先建好,用的时候径直复返即可。

publicclassSingleton{privateSingleton{}//提前创建一个SingletonprivatestaticfinalSingletoninstance=newSingleton;//有调用者径直就拿出来给了publicstaticSingletongetInstance{returninstance;}}

特质:

(1)线程安全(因为提前创建了,是以是天生的线程安全)

(2)单例对象修饰为private,只可通过getInstance赢得。

此时单例因为有static修饰,因此在类加载的时候就会运行化,这对利用的启动会形成一定进程的影响。

5、饿汉式:基本写法(instance为public)

publicclassSingleton{publicstaticfinalSingletoninstance=newSingleton;privateSingleton{}}

和上头没什么差别。

6、饿汉式:静态代码块

publicclassSingleton{privateSingletoninstance=null;privateSingleton{}//运行化章程:基静态、子静态->基实例代码块、基构造->子实例代码块、子构造static{instance=newSingleton;}publicstaticSingletongetInstance{returnthis.instance;}}

特质:

(1)线程安全

(2)类运行化时实例化instance

7、静态里面类

publicclassSingleton{//静态里面类里面创建了一个Singleton单例privatestaticclassInstanceHolder{privatestaticfinalSingletonINSTANCE=newSingleton;}privateSingleton{}publicstaticfinalSingletongetInstance{returnInstanceHolder.INSTANCE;}}

特质:

(1)线程安全

(2)成果高,幸免了synchronized带来的性能影响

这种就好许多。许多大佬都推选。

8、陈列式

publicenumSingleton{INSTANCE;//陈列同普通类相似,不错有我方的成员变量和法度publicvoidgetInstance{System.out.println("Dowhateveryouwant");}}

特质:

(1)线程安全(陈列类型默许等于安全的)

(2)幸免反序列化防止单例

陈列类型更好,然而陈列类型会形成更多的内存消耗。陈列会比使用静态变量多消耗两倍的内存,如果是Android利用,尽量幸免。原因的话,是因为陈列类型会在编译时更变为一个类,会波及许多复杂的操作,这里就先不逼逼了。

9、CAS方法

publicclassSingleton{privatestaticfinalAtomicReferenceINSTANCE=newAtomicReference;privateSingleton{}publicstaticSingletongetInstance{for(;;){Singletoninstance=INSTANCE.get;if(instance!=null){returninstance;}instance=newSingleton;if(INSTANCE.compareAndSet(null,instance)){returninstance;}}}}

特质:

(1)优点:不需要使用传统的锁机制来保证线程安全,CAS是一种基于忙恭候的算法,依赖底层硬件的达成,相干于锁它莫得线程切换和防止的非凡消耗,不错解救较大的并行度。

如果不睬解CAS的话,不错看这篇著作:

java并发编程CAS机制旨趣分析(口试必问,学习中必会的一个常识点)

(2)曲折:如果忙恭候一直施行不告捷(一直在死轮回中),会对CPU形成较大的施行支拨。而况,这种写法如果有多个线程同期施行singleton=newSingleton;也会相比破钞堆内存。

10、Lock机制

//近似双重校验锁写法publicclassSingleton{privatestaticSingletoninstance=null;privatestaticLocklock=newReentrantLock;privateSingleton{}publicstaticSingletongetInstance{if(instance==null){lock.lock;//显式调用,手动加锁if(instance==null){instance=newSingleton;}lock.unlock;//显式调用,手动解锁}returninstance;}}

虽然还有一些其他的达成单例的写法,比如说登记式单例等等。

三、单例模式的使用

1.Windows的TaskManager(任务管制器)等于很典型的单例模式(这个很纯属吧),想想看,是不是呢,你能翻开两个windowstaskmanager吗?不信你我方碰庆幸哦~

windows的RecycleBin(回收站)亦然典型的单例利用。在通盘这个词系统运行历程中,回收站一直诊治着仅有的一个实例。

网站的计数器,一般亦然汲取单例模式达成,不然难以同步。

利用要道的日记利用,一般都何用单例模式达成,这一般是由于分享的日记文献一直处于翻开现象,因为只可有一个实例去操作,不然内容不好追加。

Web利用的建立对象的读取,一般也利用单例模式,这个是由于建立文献是分享的资源。

6.数据库流畅池的筹办一般亦然汲取单例模式,因为数据库流畅是一种数据库资源。数据库软件系统中使用数据库流畅池,主若是量入制出翻开概况关闭数据库流畅所引起的成果损耗,这种成果上的损耗还长短常不菲的,因为何用单例模式来诊治,就不错大大镌汰这种损耗。

多线程的线程池的筹办一般亦然汲取单例模式,这是由于线程池要便捷对池中的线程进行限定。

操作系统的文献系统,亦然大的单例模式达成的具体例子,一个操作系统只可有一个文献系统。

所以说现在老美可能会欧洲战略乃至全球战略,去挽救他金融核弹导致的去美元化。也可能是他最后的疯狂吧!

那么是不是拥有了500万的财富,就应该称得上是财富自由?再加上大部分人实际上他连400万的工资可能都挣不到,能够挣个两三百万都已经是实属不易。这是跟自己工作的年限,包括工资待遇水平都是有直接关系的,有的人工资可能只有3000块钱,也许他最终只工作20多年。那么很显然可能能够挣上100万的薪酬待遇,都是非常不容易的。所以更何况是400万,那么400万的这个工资待遇水平,本身来讲就是比较高的,基本上是属于中产水平了。所以500万就能够实现所谓的财富自由。

四、转头

两种场景可能导致非单例的情况

场景一:如果单例由不同的类加载器加载,那便有可能存在多个单例类的实例

场景二:如果Singleton达成了java.io.Serializable接口,那么这个类的实例就可能被序列化和反序列化。

单例的写法基本上等于这些,可能在不同的场景下使用不同的方法,对我来说乐天堂FUN88,在后端更常常使用的等于陈列类型,然而Android缔造当中很少使用。

回到顶部
服务热线
官方网站:www.365jz.com
工作时间:周一至周六(09:00-18:00)
联系我们
QQ:2852320325
邮箱:w365jzcom@qq.com
地址:武汉东湖新技术开发区光谷大道国际企业中心
关注公众号

Powered by 乐天堂FUN88_Fun88乐天堂app官网 RSS地图 HTML地图

Fun88乐天堂app
乐天堂FUN88_Fun88乐天堂app官网-乐天堂FUN88 单例模式的十种写法,你会几个?