java单例模式详解.doc
上传人:yy****24 上传时间:2024-09-10 格式:DOC 页数:26 大小:73KB 金币:16 举报 版权申诉
预览加载中,请您耐心等待几秒...

java单例模式详解.doc

java单例模式详解.doc

预览

免费试读已结束,剩余 16 页请下载文档后查看

16 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

以下是我再次研究单例(java单例模式缺点)时在网上收集的资料,相信你们看完就对单例完全掌握了Java单例模式应该是看起来以及用起来简单的一种设计模式,但是就实现方式以及原理来说,也并不浅显哦。总结一下我所知道的单例模式实现方式:1.预先加载法Java代码(饿汉单例模式)classS1{privateS1(){System.out.println("ok1");}privatestaticS1instance=newS1();publicstaticS1getInstance(){returninstance;}}优点:1.线程安全的2.在类加载的同时已经创建好一个静态对象,调用时反应速度快。缺点:资源利用效率不高,可能getInstance永远不会执行到,但是执行了该类的其他静态方法或者加载了该类(Class.forName),那么这个实例仍然初始化了2.initializationondemand,延迟加载法(考虑多线程)Java代码(懒汉单例模式)classS2{privateS2(){System.out.println("ok2");}privatestaticS2instance=null;publicstaticsynchronizedS2getInstance(){if(instance==null)instance=newS2();returninstance;}}优点:资源利用率高,不执行getInstance就不会被实例,可以执行该类其他静态方法。缺点:第一次加载时发应不快,多线程使用不必要的同步开销大3.initializationondemanddoublecheck双重检测(考虑多线程)Java代码classS3{privateS3(){System.out.println("ok3");}privatevolatilestaticS3instance=null;publicstaticS3getInstance(){if(instance==null){synchronized(S3.class){if(instance==null)instance=newS3();}}returninstance;}}优点:资源利用率高,不执行getInstance就不会被实例,可以执行该类其他静态方法。缺点:第一次加载时发应不快,由于java内存模型一些原因偶尔会失败(这个问题在J2SE5.0中已经被修复,可以使用volatile//关键字来保证多线程下的单例4.initializationondemandholder(考虑多线程)Java代码classS4{privateS4(){System.out.println("ok4");}privatestaticclassS4Holder{staticS4instance=newS4();}publicstaticS4getInstance(){returnS4Holder.instance;}}优点:资源利用率高,不执行getInstance就不会被实例,可以执行该类其他静态方法。缺点:第一次加载时发应不快总结:一般采用1即可,若对资源十分在意也可考虑4,不要使用2,3了。测试代码:(暂不探讨Class.forName类加载机制)Java代码/***CreatedbyIntelliJIDEA.*User:yiminghe*Date:2009-6-8*Time:19:20:52*/publicclassSingleton{publicstaticvoidmain(String[]args)throwsException{System.out.println(Class.forName("S1"));System.out.println(Class.forName("S2"));System.out.println(Class.forName("S3"));System.out.println(Class.forName("S4"));}}/*预先加载法优点:1.线程安全的,2.在类加载的同时已经创建好一个静态对象,调用时反应速度快。缺点:资源利用效率不高,可能这个单例不会需要使用也被系统加载*/classS1{privateS1(){System.out.println("ok1");}privatestaticS1instance=newS1();publicstaticS1getInstance(){