- 浏览: 1431619 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
luhouxiang:
写的很不错,学习了
Extjs 模块化动态加载js实践 -
kingkongtown:
如果想改成淘宝后台那样,可以在编辑器批量上传图片呢?
kissy editor 阶段体会 -
317966578:
兄弟我最近也在整jquery和caja 开放一些接口。在git ...
caja 原理 : 前端 -
liuweihug:
Javascript引擎单线程机制及setTimeout执行原 ...
setTimeout ,xhr,event 线程问题 -
辽主临轩:
怎么能让浏览器不进入 文档模式的quirks模式,进入标准的
浏览器模式与文本模式
Java单例模式应该是看起来以及用起来简单的一种设计模式,但是就实现方式以及原理来说,也并不浅显哦。
总结一下我所知道的单例模式实现方式:
1.预先加载法
class S1 { private S1() { System.out.println("ok1"); } private static S1 instance = new S1(); public static S1 getInstance() { return instance; } }
优点:
1.线程安全的
2.在类加载的同时已经创建好一个静态对象,调用时反应速度快。
缺点:
资源利用效率不高,可能getInstance永远不会执行到,但是执行了该类的其他静态方法或者加载了该类(class.forName),那么这个实例仍然初始化了
2.initialization on demand,延迟加载法 (考虑多线程)
class S2 { private S2() { System.out.println("ok2"); } private static S2 instance = null; public static synchronized S2 getInstance() { if (instance == null) instance = new S2(); return instance; } }
优点: 资源利用率高,不执行getInstance就不会被实例,可以执行该类其他静态方法。
缺点:
第一次加载时发应不快 ,多线程使用不必要的同步开销大
3.initialization on demand double check 双重检测( 考虑多线程 )
class S3 { private S3() { System.out.println("ok3"); } private static S3 instance = null; public static S3 getInstance() { if (instance == null) { synchronized (S3.class) { if (instance == null) instance = new S3(); } } return instance; } }
优点: 资源利用率高, 不执行getInstance就不会被实例,可以执行该类其他静态方法。
缺点:
第一次加载时发应不快 ,由于java 内存模型一些原因偶尔会失败
4.initialization on demand holder (考虑多线程)
class S4 { private S4() { System.out.println("ok4"); } private static class S4Holder { static S4 instance = new S4(); } public static S4 getInstance() { return S4Holder.instance; } }
优点: 资源利用率高, 不执行getInstance就不会被实例,可以执行该类其他静态方法。
缺点:
第一次加载时发应不快
总结: 一般采用 1 即可,若对资源十分在意也可考虑 4 ,不要使用2,3了。
测试代码:(暂不探讨Class.forName类加载机制)
/** * Created by IntelliJ IDEA. * User: yiminghe * Date: 2009-6-8 * Time: 19:20:52 */ public class Singleton { public static void main(String[] args) throws Exception{ System.out.println(Class.forName("S1")); System.out.println(Class.forName("S2")); System.out.println(Class.forName("S3")); System.out.println(Class.forName("S4")); } } /* 预先加载法 优点:1.线程安全的, 2.在类加载的同时已经创建好一个静态对象,调用时反应速度快。 缺点: 资源利用效率不高,可能这个单例不会需要使用也被系统加载 */ class S1 { private S1() { System.out.println("ok1"); } private static S1 instance = new S1(); public static S1 getInstance() { return instance; } } /* initialization on demand,延迟加载法 (考虑多线程) 优点:1.资源利用率高 缺点:第一次加载是发应不快 ,多线程使用不必要的同步开销大 */ class S2 { private S2() { System.out.println("ok2"); } private static S2 instance = null; public static synchronized S2 getInstance() { if (instance == null) instance = new S2(); return instance; } } /* initialization on demand - double check 延迟加载法改进之双重检测 (考虑多线程) 优点:1.资源利用率高 缺点:第一次加载是发应不快 ,由于java 内存模型一些原因偶尔会失败 */ class S3 { private S3() { System.out.println("ok3"); } private static S3 instance = null; public static S3 getInstance() { if (instance == null) { synchronized (S3.class) { if (instance == null) instance = new S3(); } } return instance; } } /* initialization on demand holder (考虑多线程) 优点:1.资源利用率高 缺点:第一次加载是发应不快 */ class S4 { private S4() { System.out.println("ok4"); } private static class S4Holder { static S4 instance = new S4(); } public static S4 getInstance() { return S4Holder.instance; } }
发表评论
-
continuation, cps
2013-09-12 16:49 2711起 随着 nodejs 的兴起,异步编程成为一种潮流 ... -
using mustache with spring mvc
2011-06-16 20:30 4657spring 基本不用介绍了,是目前最好的 IOC 容器了 ... -
备忘:使用 intellij idea 进行远程调试
2011-05-03 18:56 33539以前都是很土得打 log ,发现一篇关于 java 调试器架构 ... -
前后端编码传递
2010-10-21 00:12 1982背景: 关于编码是 BS 的开发是个大问题,包 ... -
javabean与attribute
2010-07-15 21:02 2370以前很忽视 javabean , ... -
JAVA学习路线图
2010-06-20 23:24 0最近论坛上看到好几个朋友都在问,如何学习 Java的问题, ... -
linux下定位java应用
2010-06-09 02:48 1379场景: java 应用不同于其它程序,在ps查看时程 ... -
java中的协变
2010-05-27 23:17 3309一个一直有点模糊的概念,记录一下,协变是指一个类型随着它关联的 ... -
验证码图片生成
2010-04-29 22:15 0<%@ page contentType="i ... -
利用aop重构数据访问层
2010-02-24 20:57 2059由于一直以来小项目做的多,造成了轻后端重前端的恶果,结果后端现 ... -
struts2讲义
2009-11-07 11:53 0struts2讲义 -
xml transfer for beyond compare
2009-10-22 17:33 0xml transfer for beyond compare ... -
Digester 空白保留问题
2009-10-17 16:40 1921Digester 详细介绍 : apach ... -
Jsp - pageEncoding 解析
2009-09-29 22:28 2390pageEncoding 作为 Jsp page 指令 ... -
图解JVM在内存中申请对象及垃圾回收流程
2009-09-15 20:33 0http://longdick.ite ... -
javarebel
2009-09-11 22:23 0使用JavaRebel实现即时重载javaclass更改 ... -
mac java web开发配置备忘
2009-09-05 17:02 89基本上和linux配置差不多,mac 可算兼具 linux 命 ... -
10个让我去寻找比Java更好的语言的理由
2009-08-26 13:02 0别误会我. 在我的职业生涯中我写了无数的Java代码,我当 ... -
生僻用法:finally and return
2009-08-26 12:55 1447本质上还是 reference 与 primitive val ... -
事件人工详情整理Pattern
2009-08-09 16:13 0事件人工详情整理Pattern
相关推荐
单例模式是最简单的设计模式之一,但是对于Java的开发者来说,它却有很多缺陷。在本月的专栏中,David Geary探讨了单例模式以及在面对多线程(multithreading)、类装载器(classloaders)和序列化(serialization)时...
单例模式是最简单的设计模式之一,但是对于Java的开发者来说,它却有很多缺陷。在本月的专栏中,David Geary探讨了单例模式以及在面对多线程(multithreading)、类装载器(classloaders)和序列化(serialization)时...
所以对不同单例模式的实现进行了分别探讨。主要单例模式实现如下: 饿汉式 懒汉式 线程安全的懒汉式 双重校验锁式 静态内部类式 PS:该篇文章不讨论单例模式的运用场景与各种模式下的单例模式的优缺点。只讨论在...
《java设计模式(第2版)》通过一个完整的java项目对经典著作design patterns一书介绍的23种设计模式进行了深入分析与讲解,实践性强,却又不失对模式本质的探讨。本书创造性地将这些模式分为5大类别,以充分展现各个...
您将了解如何正确创建对象实例、访问实例的成员变量和方法、实现对象的拷贝(包括浅拷贝和深拷贝)、判断对象相等性、管理对象的生命周期、实现线程安全的单例模式等。此外,我们还探讨了对象的哈希码、重写equals()...
创建型设计模式5种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式 2、在解决了对象的创建问题之后,对象的组成以及对象之间的依赖关系就成了开发人员关注的焦点,因为如何设计对象的结构、继承和...
书中首先从oop采用的机制——抽象类、接口、契约式编程开始讲起,然后介绍了静态方法、单例模式、工厂模式和php 6的新特性等内容,接着介绍了测试和文档方面的内容,还介绍了标准php库spl方面的知识以及php开发人员...
第5章 单例模式(Singleton) 第6章 工厂方法模式(Factory Method) 第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11...
第5章 单例模式(Singleton) 第6章 工厂方法模式(Factory Method) 第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11...
第5章 单例模式(Singleton) 第6章 工厂方法模式(Factory Method) 第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11...
5并行模式与算法 5.1探讨单例模式 5.3生产者-消费者模式 5.5future模式 5.2不变模式 5.4高性能的生产者-消费者模式:无锁的实现 5.6并行流水线 01 02 03 04 05 06 实战Java高并发程序设计(第2版)PPT模板全文共25...
书中首先从OOP 采用的机制—— 抽象类、接口、契约式编程开始讲起,然后介绍了静态方法、单例模式、工厂模式和PHP 6 的新特性等内容,接着介绍了测试和文档方面的内容,还介绍了标准PHP 库SPL 方面的知识以及PHP ...
书中首先从oop采用的机制——抽象类、接口、契约式编程开始讲起,然后介绍了静态方法、单例模式、工厂模式和php 6的新特性等内容,接着介绍了测试和文档方面的内容,还介绍了标准php库spl方面的知识以及php开发人员...
1、创建型模式(creational):单例模式、静态工厂模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。 对创建对象进行统一管理,对外屏蔽创建对象的细节 软件设计的过程是循序渐进的,一步一步来的。在软件...
反复使用:这个不用过多解释,设计模式被使用太多了,上个系列spring源码当中就出现了很多模式,记忆中比较深刻的有模板模式,代理模式,单例模式,工厂模式等等。 多数人知晓:这个就不需要过多解释了。 分类编目:...
设计模式之 Singleton(单态/单件) 阎宏博士讲解:单例(Singleton)模式 保证一个类只有一个实例,并提供一个访问它的全局访问点 设计模式之 Factory(工厂方法和抽象工厂) 使用工厂模式就象使用 new 一样频繁. ...