设计模式与系列之单例模式 .ppt

  1. 1、本文档共20页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
设计模式与系列之单例模式

Copyright 2008, GBCOM Communication Technology 中国自主知识产权 设计模式系列之单例模式 Shanghai GBCOM Communication Technology Co.,Ltd Production Technology | 2008 Copyright 2008, GBCOM Communication Technology 部门:网管组 姓名:苏越嘉 日期:2012-3-27 单例Singleton模式概念 概念: 作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 单例的要点 某个类能有一个实例 它必须自行创建这个实例 它必须向整个系统提供这个实例 客户甲 客户乙 客户丙 单例对象 单例在生活中的例子 Window中的例子—回收站 思考回收站如何符合单例的3要点? 某个类能有一个实例 一个win系统只有一个回收站. 它必须自行创建这个实例 回收站不需要我们来创建,系统会自己创建. 它必须向整个系统提供这个实例 我们删除的东西都会放入这个回收站实例 单例形式之饿汉式单例 Public class EagerSingleton{ Private static final EagerSingleton m_instance = new EagerSingleton(); /* * 私有的默认构造方法 */ private EagerSingleton(){} /* * 静态工厂方法 */ public static EagerSingleton getInstance(){ return m_instance; } } 类被加载时,静态变量m_instance就会被初始化,私有构造方法会被调用,单例的唯一实例就被创建出来了. 单例形式之懒汉式单例 Public class LazySingleton{ Private static LazySingleton m_instance = null; /* * 私有的默认构造方法 */ private LazySingleton(){} /* * 静态工厂方法 */ synchronized public static LazySingleton getInstance(){ if(m_instance == null) m_instance = new LazySingleton(); return m_instance; } } 懒汉单例在第一次被引用的时候实例化. 单例形式之懒汉饿汉式比较 懒汉单例 饿汉单例 资源利用 速度与反应 双重检查成例研究 成例是一种代码层次上的模式,是在比设计模式的更次更具体饿层次上的代码技巧. 双重检查成例(Double Check Idiom)是从C语言移植过来的一种代码模式.在C语言里,双重检查成例常常用在多线程环境中类得晚实例化里 单线程对象实例例子 private Foo foo = null; public static Foo getInstance(){ if(foo == null){ foo = new Foo(); } return foo; } 该例子在多线程环境下是不安全的!为什么? 双重检查成例研究 线程安全的例子 private Foo foo = null; public synchronized static Foo getInstance(){ if(foo == null){ foo = new Foo(); } return foo; } synchronized修饰符保证了该方法访问的独占性,虽然加锁颗粒度较大,性能有所降低.但是保证了线程的安全性. 双重检查成例研究 为了使代码增加性能,减小加锁的颗粒度,于是就有了双重检查成例的设计. Public class LazySingleton{ Private LazySingleton instance= null; Private LazySingleton (){} Public static LazySingleton getInstance(){ if(instance == null){//第一次检查的位置(位置1) //多个线程会到达这(位置2) synchronized(LazySingleton.class){ //只有一个线程达到这(位置3) if(foo == n

文档评论(0)

ctuorn0371 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档