达内培训Java中的模式--单态

达内培训Java中的模式--单态

ID:40317035

大小:14.94 KB

页数:6页

时间:2019-07-31

达内培训Java中的模式--单态_第1页
达内培训Java中的模式--单态_第2页
达内培训Java中的模式--单态_第3页
达内培训Java中的模式--单态_第4页
达内培训Java中的模式--单态_第5页
资源描述:

《达内培训Java中的模式--单态》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、单态定义:  Singleton模式主要作用是保证在Java培训应用程序中,一个类Class只有一个实例存在。  Singleton模式就为我们提供了这样实现的可能。使用Singleton的好处还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收(garbagecollection)。  使用Singleton注意事项:  有时在某些情况下,使用Singleton并不能达到Singleton的目的,如有多个Singleton对象同时被不同的类装入器装载;在EJB这样的分布式系统中使用也要注意这种情况,因为EJB是跨服务器,跨JVM的  单态模式的演化:  单态模式是个简单

2、的模式,但是这个简单的模式也有很多复杂的东西。  一,首先最简单的单态模式,单态模式1  importjava.util.*;  classSingleton  {  privatestaticSingletoninstance;  privateVectorv;  privatebooleaninUse;  privateSingleton()  {  v=newVector();  v.addElement(newObject());  inUse=true;  }  publicstaticSingletongetInstance()  {  if(instance==null)

3、//1  instance=newSingleton();//2  returninstance;//3  }  }  这个单态模式是不安全的,为什么说呢?因为没考虑多线程,如下情况  Thread1调用getInstance()方法,并且判断instance是null,然後进入if模块,  在实例化instance之前,  Thread2抢占了Thread1的cpu  Thread2调用getInstance()方法,并且判断instance是null,然後进入if模块,  Thread2实例化instance完成,返回  Thread1再次实例化instance  这个单态已经不在

4、是单态  二,为了解决刚才的问题:单态模式2  publicstaticsynchronizedSingletongetInstance()  {  if(instance==null)//1  instance=newSingleton();//2  returninstance;//3  }  采用同步来解决,这种方式解决了问题,但是仔细分析正常的情况下只有第一次时候,进入对象的实例化,须要同步,其它时候都是直接返回已经实例化好的instance不须要同步,大家都知到在一个多线程的程序中,如果同步的消耗是很大的,很容易造成瓶颈  三,为了解决上边的问题:单态模式3,加入同步  pu

5、blicstaticSingletongetInstance()  {  if(instance==null)  {  synchronized(Singleton.class){  instance=newSingleton();  }  }  returninstance;  }  同步改成块同步,而不使用函数同步,但是仔细分析,  又回到了模式一的状态,再多线程的时候根本没有解决问题  四,为了对应上边的问题:单态模式4,也就是很多人采用的Double-checkedlocking  publicstaticSingletongetInstance()  {  if(instan

6、ce==null)  {  synchronized(Singleton.class){//1  if(instance==null)//2  instance=newSingleton();//3  }  }  returninstance;  }  这样,模式一中提到的问题解决了。不会出现多次实例化的现象  当第一次进入的时候,保正实例化时候的单态,在实例化后,多线程访问的时候直接返回,不须要进入同步模块,既实现了单态,又没有损失性能。表面上看我们的问题解决了,但是再仔细分析:  我们来假象这中情况:  Thread1:进入到//3位置,执行newSingleton(),但是在构造

7、函数刚刚开始的时候被Thread2抢占cpu  Thread2:进入getInstance(),判断instance不等于null,返回instance,  (instance已经被new,已经分配了内存空间,但是没有初始化数据)  Thread2:利用返回的instance做某些操做,失败或者异常  Thread1:取得cpu初始化完成  过程中可能有多个线程取到了没有完成的实例,并用这个实例作出某些操做。  ----------------

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

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

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