JAVA中单例模式的几种实现方式.doc
上传人:qw****27 上传时间:2024-09-11 格式:DOC 页数:5 大小:34KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

JAVA中单例模式的几种实现方式.doc

JAVA中单例模式的几种实现方式.doc

预览

在线预览结束,喜欢就下载吧,查找使用更方便

15 金币

下载此文档

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

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

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

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

JAVA中单例模式的几种实现方式1线程不HYPERLINK"http://security.chinaitlab.com/"\t"_blank"安全的实现方法首先介绍java中最基本的单例模式实现方式,我们可以在一些初级的java书中看到。这种实现方法不是线程HYPERLINK"http://security.chinaitlab.com/"\t"_blank"安全的,所以在项目实践中如果涉及到线程安全就不会使用这种方式。但是如果不需要保证线程安全,则这种方式还是不错的,因为所需要的开销比较小。下面是具体的实现代码:publicClassSingleton{privatestaticSingletoninstance=null;privateSingleton(){}publicstaticSingletongetInstance(){if(instance==null)instance=newSingleton();returninstance;}}我们说过这种实现方式不是thread-safe的,那么可以把上面的方法变成线程安全的吗?当然可以,在方法getInstance()上加上synchronized修饰符就可以实现方法的同步了。但是这样系统开销会很大。具体代码如下:publicClassSingleton{privatestaticSingletoninstance=null;privateSingleton(){}publicstaticsynchronizedSingletongetInstance(){if(instance==null)instance=newSingleton();returninstance;}}每次有线程调用getInstance()方法,都需要同步判断。这显然不是最好的选择,下面将会陆续介绍几种thread-safe的方法。2两种lazyloadedthread-safe的单例模式实现方式1)DCL(doublecheckedlocking实现法)doublecheckedlocking,顾名思义,就是双检查法,检查实例INSTANCE是否为null或者已经实例化了。下面是具体的实现代码:1publicclassDoubleCheckedLockingSingleton{2privatevolatileDoubleCheckedLockingSingletonINSTANCE;34privateDoubleCheckedLockingSingleton(){}56publicDoubleCheckedLockingSingletongetInstance(){7if(INSTANCE==null){8synchronized(DoubleCheckedLockingSingleton.class){9//doublecheckingSingletoninstance10if(INSTANCE==null){11INSTANCE=newDoubleCheckedLockingSingleton();12}13}14}15returnINSTANCE;16}17}这种方法也很好理解,我们可以看到有两次对instance是否为null的判断:如果第一次判断不为空,则直接返回实例就可以了;如果instance为空,则进入同步代码块再进行null值判断,再选择是否实例化。第一个null判断可以减少系统的开销。在实际项目中做过多线程开发的都应该知道DCL.2)lazyinitializationholderclass模式实现法下面是这种方法的实现代码:publicclassSingleton{/***类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例*没有绑定关系,而且只有被调用到才会装载,从而实现了延迟加载*/privatestaticclassSingletonHolder{/***静态初始化器,由JVM来保证线程安全*/privatestaticSingletoninstance=newSingleton();}/***私有化构造方法*/privateSingleton(){}publicstaticSingletongetInstance(){returnSingletonHolder.instance;}}当getInstance方法第一次被调用的时候,它第一次读取SingletonHolder.instance,导致SingletonHolder类得到初始化;而这个类在装载并被初始化的时候,会初始化它的静态域,从而创