java单例模式详解

java单例模式详解

ID:40313941

大小:52.00 KB

页数:5页

时间:2019-07-30

java单例模式详解_第1页
java单例模式详解_第2页
java单例模式详解_第3页
java单例模式详解_第4页
java单例模式详解_第5页
资源描述:

《java单例模式详解》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、Java单例模式详解概念:  java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。  单例模式有一下特点:  1、单例类只能有一个实例。  2、单例类必须自己自己创建自己的唯一实例。  3、单例类必须给所有其他对象提供这一实例。  单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个PrinterSpoo

2、ler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。首先看一个经典的单例实现。publicclassSingleton{   privatestaticSingletonuniqueInstance=null;    privateSingleton(){      //Existsonlytodefeatinstantiation.   }    publicstaticSinglet

3、ongetInstance(){      if(uniqueInstance==null){          uniqueInstance=newSingleton();      }      returnuniqueInstance;   }   //Othermethods...}Singleton通过将构造方法限定为private避免了类在外部被实例化,在同一个虚拟机范围内,Singleton的唯一实例只能通过getInstance()方法访问。(事实上,通过Java反射机制是能够实例化构造方法为private的类的,那基本

4、上会使所有的Java单例实现失效。此问题在此处不做讨论,姑且掩耳盗铃地认为反射机制不存在。)但是以上实现没有考虑线程安全问题。所谓线程安全是指:如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。显然以上实现并不满足线程安全的要求,在并发环境下很可能出现多个Single

5、ton实例。1publicclassTestStream{2privateStringname;3publicStringgetName(){4returnname;5}6publicvoidsetName(Stringname){7this.name=name;8}9//该类只能有一个实例10privateTestStream(){}//私有无参构造方法11//该类必须自行创建12//有2种方式13/*privatestaticfinalTestStreamts=newTestStream();*/14privatestaticTes

6、tStreamts1=null;15//这个类必须自动向整个系统提供这个实例对象16publicstaticTestStreamgetTest(){17if(ts1==null){18ts1=newTestStream();19}20returnts1;21}22publicvoidgetInfo(){23System.out.println("outputmessage"+name);24}25}1publicclassTestMain{2publicstaticvoidmain(String[]args){3TestStreams=

7、TestStream.getTest();4s.setName("张孝祥");5System.out.println(s.getName());6TestStreams1=TestStream.getTest();7s1.setName("张孝祥");8System.out.println(s1.getName());9s.getInfo();10s1.getInfo();11if(s==s1){12System.out.println("创建的是同一个实例");13}elseif(s!=s1){14System.out.println

8、("创建的不是同一个实例");15}else{16System.out.println("applicationerror");17}18}19}运行结果:  张孝祥  张孝祥  outputmessage

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。