`

解析Singleton开发模式

阅读更多
单例模式(Singleton pattern)
一个singleton 类是指这个类只能有一个实例,当系统只要求一个类的唯一实例时,我们就采用单例模式。要实现一个singleton类,我们首先要设置一个全局的点,以便其它类可以得到这个实例,其次很重要的一点是构造函数必须设定为私有,具体的实现通常有两种方式:饿汉式和懒汉式。从字面上去理解,懒汉式就是在不用的时候不去new这个实例,用到才去创建这个实例,它比较省空间,但是耗费时间;饿汗式是先提前new好实例,这样省时间但是耗费空间。

饿汉式:
public class Singleton {
	//设置全局点,在类加载的时候就实例化
	private static Singleton instence = new Singleton();
	//私有的构造函数
	private Singleton(){};
	public static Singleton getInstence(){
		return instence;
	}
}


懒汉式:
public class Singleton {
	//设置全局点,在类加载的时候仅仅声明一个空的对象
	private static Singleton instance = null;
	//私有的构造函数
	private Singleton(){};
	public static Singleton getInstence(){
		if(instence == null) 
			instence = new Singleton();
		return instence;
	}
}

对于饿汉式的singleton是线程安全的,因为它在类加载的时候就实例化了一个对象,在高并发的多线程中,能访问到的也只有这一个实例。而对于懒汉式来讲,它并不是线程安全的,我们可以想象,在一个多线程的环境下,线程a判断instence为空时,因为创建对象需要时间,所以线程a等待实例创建,这时线程b正好也判断instence,而这时instence仍然为空,所以线程b也导致new了一个对象,这样就导致创建了多个对象。于是我们想到了使用同步锁,我们可以把同步锁加在一个方法上面,也可以加在一段代码上面,在这里我们为了减少系统性能消耗,我们仅在创建对象的时候进行同步就可以,为了保证只有第一个线程才可以创建对象,我们要在判断一次instence是否为空,改进后的代码如下:
public class Singleton {
	//设置全局点,在类加载的时候仅仅声明一个空的对象
	private static Singleton instance = null;
	//私有的构造函数
	private Singleton(){};
	public static Singleton getInstence(){
		if(instence == null) 
			synchronized(Singleton.class){
				if(instence == null)
					instence = new Singleton();
			}
		return instence;
	}
}


***在这里我们用到了synchronized方法,如果对synchronized不了解,在其他文章中会详细介绍多线程中的同步机制。

但是我们如果仔细分析上面的例子,当创建对象的时候,jvm首先在栈中创建一个引用变量,然后再在堆中创建对象,中间是有时间间隔的,在这里,instence就是引用变量,jvm为它分配内存后,instence中的值已经不为空,这时如果另一个线程访问,它就会返回这个临时的值,因此用这种方法也不能解决线程安全问题。最终我们用了一个中间类解决了线程安全问题。
public class Singleton {
	private  Singleton() {}  
	private static class SingletonHolder {
		private static final Singleton INSTANCE = new Singleton();
	}
	public static Singleton getInstance() {
		 return SingletonHolder.INSTANCE; 
	}
}


当某对象第一次调用Singleton.getInstance()时,Singleton类被首次主动使用,jvm对其进行初始化(此时并不会调用Singleton()构造方法),然后Singleton调用getInstance()方法,该方法中,又首次主动使用了SingletonHolder类,所以要对SingletonHolder类进行初始化,初始化中,INSTANCE常量被赋值时才调用了Singleton的构造方法Singleton(),完成了实例化并返回该实例。当再有对象(也许是在别的线程中)再次调用Singleton.getInstance()时,因为已经初始化过了,不会再进行初始化步骤,所以直接返回INSTANCE常量即同一个Singleton实例。
分享到:
评论

相关推荐

    设计模式解析-英文

    设计模式解析(第2版)》以作者自身学习、使用模式和多年来为软件开发人员(包括面向对象技术老兵和新手)讲授模式的经验为基础撰写而成。首先概述了模式的基础知识,以及面向对象分析和设计在当代软件开发中的重要性,...

    设计模式精解-GoF 23 种设计模式解析附 C++实现源码.rar

    1.2 AbstactFactory模式 ..........................................................................................................11 1.3 Singleton模式 .....................................................

    OBJECTIVE-C编程之道 IOS设计模式解析电子书+源代码

    OBJECTIVE-C编程之道 IOS设计模式解析电子书+源代码《Objective-C编程之道:iOS设计模式解析》是基于iOS的软件开发指南。书中应用GoF的经典设计模式,介绍了如何在代码中应用创建型模式、结构型模式和行为模式,...

    asp.net知识库

    C#2.0 Singleton 的实现 .Net Framwork 强类型设计实践 通过反射调用類的方法,屬性,字段,索引器(2種方法) ASP.NET: State Server Gems 完整的动态加载/卸载程序集的解决方案 从NUnit中理解.NET自定义属性的应用...

    破解Objective-C面试:笑到最后的技术攻略!.zip

    C、iOS开发、Mac OS X、编程语言、面向对象编程、内存管理、自动引用计数(ARC)、协议(protocol)、类扩展(category)、键值观察(KVO)、键值编码(KVC)、Block、Delegate模式、多态性、Singleton模式、异常...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    鉴于市场上用户的手机型号、种类、屏幕分辨率等参差不齐,传统方式根据主流系统分别开发相应的系统耗时又耗力,为了高效开发并节约开发项目成本,本文采用Android+HTML5相结合的方式进行移动端Web系统的设计研发工作...

    day020-继承加强和设计模式代码和笔记.rar

    4. Properties资源(配置)文件的解析(重点) ---------------------------------(注意:重点)------------------------------------- 以后配置文件都要放到项目中的一个或者几个单独的文件夹中,为了好管理...

    JAVA 范例大全 光盘 资源

    实例31 单例模式(Singleton) 75 实例33 开车(简单工厂模式) 77 实例33 旅游(工厂方法模式) 79 实例34 花园布局(抽象工厂模式) 80 实例35 几何图形(适配器模式) 82 第6章 字符串 85 实例36 获取字符...

    java 面试题 总结

    assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为...

    超级有影响力霸气的Java面试题大全文档

    assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为...

    精通QTP——自动化测试技术领航

    5.1.2 单例设计模式(Singleton) 346 5.2 GUI层面向对象的扩展设计 351 5.2.1 层的概念 351 5.2.2 封装测试对象类 352 5.2.3 调用业务行为 355 5.2.4 对象识别结果分析 355 5.2.5 总结 356 6.1 框架设计理念 356 ...

    java面试题及技巧4

    基于MVC的.java.web设计与开发.pdf │ 学习Struts提供的和Form相关标签.txt │ 日企编码规范.doc │ 电信盈科面试题.pdf │ 速算.txt │ 面试题URL.txt │ ├─Javascript │ │ javascript资料(源码,教材,ppt)....

    TRACV:使用自定义Swing UI在面向对象标准上创建的塔防游戏

    它使用各种设计模式,例如Observer,Iterator和Singleton。 使用自定义Swing以获得更现代的外观 实现诸如A *之类的算法以启用对敌​​人的路径查找 使用JSON解析进行级别和设置。 指示 - 克隆码 添加Jackson,...

    java基础题 很全面

    14. 如何设定的weblogic的热启动模式(开发模式)与产品发布模式? 22 15. 如何启动时不需输入用户名与密码? 22 16. 在weblogic管理制台中对一个应用域(或者说是一个网站,Domain)进行jms及ejb或连接池等相关信息进行...

    Spring面试题

    3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能 5.容器提供了众多的辅助类,能加快应用的开发 6.spring对于主流的应用框架提供了集成支持,如hibernate,JPA,...

    java面试题及技巧3

    基于MVC的.java.web设计与开发.pdf │ 学习Struts提供的和Form相关标签.txt │ 日企编码规范.doc │ 电信盈科面试题.pdf │ 速算.txt │ 面试题URL.txt │ ├─Javascript │ │ javascript资料(源码,教材,ppt)....

    Java JDK实例宝典

    8 Singleton单例模式 2. 9 Factory工厂模式 2. 10 Adapter适配器模式 第3章 数字 3. 1 数字与数字封装类 3. 2 格式化数字 3. 3 数字的舍入 3. 4 转换数字的进制 3. 5 生成随机数 ...

    最新Java面试宝典pdf版

    一. Java基础部分 7 1、一个".java"源文件中是否可以包括多个类(不是内部类)?...8、如何设定的weblogic的热启动模式(开发模式)与产品发布模式? 129 9、如何启动时不需输入用户名与密码? 130 10、...

Global site tag (gtag.js) - Google Analytics