深入Java单例模式浅析

深入Java单例模式浅析

ID:40311154

大小:46.50 KB

页数:8页

时间:2019-07-30

深入Java单例模式浅析_第1页
深入Java单例模式浅析_第2页
深入Java单例模式浅析_第3页
深入Java单例模式浅析_第4页
深入Java单例模式浅析_第5页
资源描述:

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

1、在GoF的23种设计模式中,单例模式是比较简单的一种。然而,有时候越是简单的东西越容易出现问题。下面就单例设计模式详细的探讨一下。  所谓单例模式,简单来说,就是在整个应用中保证只有一个类的实例存在。就像是JavaWeb中的application,也就是提供了一个全局变量,用处相当广泛,比如保存全局数据,实现全局性的操作等。  1.最简单的实现  首先,能够想到的最简单的实现是,把类的构造函数写成private的,从而保证别的类不能实例化此类,然后在类中提供一个静态的实例并能够返回给使用者。这样,使用者就可以

2、通过这个引用使用到这个类的实例了。public class SingletonClass {  private static final SingletonClass instance = new SingletonClass();  public static SingletonClass getInstance() {  return instance;  }  private SingletonClass() {  }  }  如上例,外部使用者如果需要使用SingletonClass的实例,只能通过g

3、etInstance()方法,并且它的构造方法是private的,这样就保证了只能有一个对象存在。  2.性能优化——lazyloaded  上面的代码虽然简单,但是有一个问题——无论这个类是否被使用,都会创建一个instance对象。如果这个创建过程很耗时,比如需要连接10000次数据库(夸张了…:-)),并且这个类还并不一定会被使用,那么这个创建过程就是无用的。怎么办呢?  为了解决这个问题,我们想到了新的解决方案:public class SingletonClass {  private static

4、 SingletonClass instance = null;  public static SingletonClass getInstance() {  if(instance == null) {  instance = new SingletonClass();  }  return instance;  }  private SingletonClass() {  }  }  代码的变化有两处——首先,把instance初始化为null,直到第一次使用的时候通过判断是否为null来创建对象。因为创

5、建过程不在声明处,所以那个final的修饰必须去掉。  我们来想象一下这个过程。要使用SingletonClass,调用getInstance()方法。第一次的时候发现instance是null,然后就新建一个对象,返回出去;第二次再使用的时候,因为这个instance是static的,所以已经不是null了,因此不会再创建对象,直接将其返回。  这个过程就成为lazyloaded,也就是迟加载——直到使用的时候才进行加载。  3.同步  上面的代码很清楚,也很简单。然而就像那句名言:“80%的错误都是由20

6、%代码优化引起的”。单线程下,这段代码没有什么问题,可是如果是多线程,麻烦就来了。我们来分析一下:  线程A希望使用SingletonClass,调用getInstance()方法。因为是第一次调用,A就发现instance是null的,于是它开始创建实例,就在这个时候,CPU发生时间片切换,线程B开始执行,它要使用SingletonClass,调用getInstance()方法,同样检测到instance是null——注意,这是在A检测完之后切换的,也就是说A并没有来得及创建对象——因此B开始创建。B创建完

7、成后,切换到A继续执行,因为它已经检测完了,所以A不会再检测一遍,它会直接创建对象。这样,线程A和B各自拥有一个SingletonClass的对象——单例失败!  解决的方法也很简单,那就是加锁:    public class SingletonClass {  private static SingletonClass instance = null;  public synchronized static SingletonClass getInstance() {  if(instance == nu

8、ll) {  instance = new SingletonClass();  }  return instance;  }  private SingletonClass() {  }  }  是要getInstance()加上同步锁,一个线程必须等待另外一个线程创建完成后才能使用这个方法,这就保证了单例的唯一性。  4.又是性能  上面的代码又是很清楚很简单的,然而,简单的东西往往不够理想。这

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

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

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