




全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JAVA中单例模式的几种实现方式1 线程不安全的实现方法首先介绍java中最基本的单例模式实现方式,我们可以在一些初级的java书中看到。这种实现方法不是线程安全的,所以在项目实践中如果涉及到线程安全就不会使用这种方式。但是如果不需要保证线程安全,则这种方式还是不错的,因为所需要的开销比较小。下面是具体的实现代码:public Class Singletonprivate static Singleton instance = null;private Singleton()public static Singleton getInstance()if( instance = null)instance = new Singleton ();return instance;我们说过这种实现方式不是thread-safe的,那么可以把上面的方法变成线程安全的吗?当然可以,在方法getInstance()上加上synchronized修饰符就可以实现方法的同步了。但是这样系统开销会很大。具体代码如下:public Class Singletonprivate static Singleton instance = null;private Singleton()public static synchronized Singleton getInstance()if( instance = null)instance = new Singleton ();return instance;每次有线程调用getInstance()方法,都需要同步判断。这显然不是最好的选择,下面将会陆续介绍几种thread-safe的方法。2 两种lazy loaded thread-safe的单例模式实现方式1) DCL (double checked locking 实现法)double checked locking ,顾名思义,就是双检查法,检查实例INSTANCE是否为null或者已经实例化了。下面是具体的实现代码:1 public class DoubleCheckedLockingSingleton2 private volatile DoubleCheckedLockingSingleton INSTANCE;34 private DoubleCheckedLockingSingleton()56 public DoubleCheckedLockingSingleton getInstance()7 if(INSTANCE = null)8 synchronized(DoubleCheckedLockingSingleton.class)9 /double checking Singleton instance10 if(INSTANCE = null)11 INSTANCE = new DoubleCheckedLockingSingleton();12 13 14 15 return INSTANCE;16 17 这种方法也很好理解,我们可以看到有两次对instance是否为null的判断:如果第一次判断不为空,则直接返回实例就可以了;如果instance为空,则进入同步代码块再进行null值判断,再选择是否实例化。第一个null判断可以减少系统的开销。在实际项目中做过多线程开发的都应该知道DCL.2) lazy initialization holder class 模式实现法下面是这种方法的实现代码:public class Singleton /* 类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例* 没有绑定关系,而且只有被调用到才会装载,从而实现了延迟加载*/private static class SingletonHolder/* 静态初始化器,由JVM来保证线程安全*/private static Singleton instance = new Singleton();/* 私有化构造方法*/private Singleton()public static Singleton getInstance()return SingletonHolder.instance;当getInstance方法第一次被调用的时候,它第一次读取SingletonHolder.instance,导致SingletonHolder类得到初始化;而这个类在装载并被初始化的时候,会初始化它的静态域,从而创建Singleton的实例,由于是静态的域,因此只会被虚拟机在装载类的时候初始化一次,并由虚拟机来保证它的线程安全性。这个模式的优势在于,getInstance方法并没有被同步,并且只是执行一个域的访问,因此延迟初始化并没有增加任何访问成本。关于延迟初始化(lazy loaded)除非绝对必要,否则就不要延迟初始化.延迟初始化是一把双刃剑,它降低了初始化类或者创建实例的开销,却增加了访问被延迟初始化的域的开销,考虑到延迟初始化的域最终需要初始化的开销以及域的访问开销,延迟初始化实际上降低了性能。3 静态工厂实现法因为单例是静态的final变量,当类第一次加载到内存中的时候就初始化了,其thread-safe性由JVM来负责保证。值得注意的是这个实现方式不是lazy-loadedd的。 具体实现代码如下:1 public class Singleton2 /initailzed during class loading3 private static final Singleton INSTANCE = new Singleton();45 private Singleton()67 public static Singleton getSingleton()8 return INSTANCE;9 10 4 枚举实现单例(Enum Singleton)枚举单例(Enum Singleton)是实现单例模式的一种新方式,枚举这个特性是在Java5才出现的,在Effective Java一书中有介绍这个特性。下面是这种方法的具体实现代码:public enum Singleton INSTANCE(hello) public void someMethod() / . . .;private String name;private void PrintName()System.out.println(name);protected abstract void someMethod();你可以通过Singleton.INSTANCE来访问该单示例变量。默认枚举实例的创建是线程安全的,但
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 环保材料的开发与应用-洞察及研究
- 多语言环境下的母婴教育内容适配策略-洞察及研究
- 大数据在跨境电商市场分析中的作用-洞察及研究
- 情感分析在在线教育中的应用-洞察及研究
- 林产工业政策与农村发展-洞察及研究
- 农村环境卫生与农村文化传承保护-洞察及研究
- 生物医药研发项目合同履行方案
- 【《离心飞重建模分析案例》1400字】
- 【《发酵法制备鼠李糖脂工艺计算过程案例》1700字】
- 智慧鲜生运营策略-洞察及研究
- 纳税申报流程课件
- 2025年秋期新教科版四年级上册小学科学教学计划+进度表
- 2025全国质量月数智驱动筑基强链创新质量生态宣传模板
- 2025新疆维吾尔自治区人民检察院招聘聘用制书记员(14人)笔试参考题库附答案解析
- 循环水泵设备安装方案详细指导
- 2024年喀什经济开发区兵团分区招聘真题
- 作风建设永远在路上教学课件
- (2025)中小学爱国知识竞赛试题附答案
- 新媒体文案写作教程(第二版)课件 项目五 微博文案写作 课件
- 《水力学》课件-第4章 水动力学基础(二)
- 生活垃圾填埋场环境污染的排查与治理方案
评论
0/150
提交评论