设计模式之略见一斑(单例模式singleton)
单例模式是属于比较常用的一例,一个类(class)在内存中只有一个实例。
常用方式如下:
第一种(饿汉式):
public class Singleton {
private Singleton(){}
//在自己内部定义自己一个实例,是不是很奇怪? //注意这是private 只供内部调用
private static Singleton instance = new Singleton();
//这里提供了一个供外部访问本class的静态方法,可以直接访问 public static Singleton getInstance() { return instance; } }
第二种方式:(懒汉式)
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
//这个方法比上面有所改进,不用每次都进行生成对象,只是第一次 if (instance==null) instance=new Singleton(); return instance; }
}
比较安全的使用方式是第一种private static Singleton instance = new Singleton();
单例的陷井:
多个虚拟机
当单例类被运行在多个虚拟机下的时候,在每个虚拟机都可以创建一个实例对歇脚。像使用了EJB,JINI,RMI技术的分布式系统的时候,因为中间件屏蔽了分布式系统在物理上的差异,这个时候想知道在哪个虚拟机下运行着哪个单例对象很困难。因此在使用分布式技术时,应该避免使用
多个类加载器
当存在多个类加载器,即使它们加载的相同包名,相同类名甚至每个字节都完全相同的类,也会被区别对待的。因为不同的类加载器会使用不同的命名空间来区分同一个类,因此,单例类在多加载器的环境下会产生多个单例对象。也许你认为出现多个类加载器的情况不多,其实多个类加载器存在的情况不少,在很多J2EE服务器上允许存在多个SERVLET引擎,而每个引擎是采用不同的类加载器的,浏览器的APPLET小程序通过网络加载类的时候,由于安全因素,采用的是特殊类加载器,等等。
在这种情况,由状态的单例模式也会给系统带来隐患。因此除非系统由协调机制,在一般情况下不要使用存在状态的单例模式。
错误的同步处理
在使用上面介绍的懒汉式单模式的时候,同步得理恰当与否也是很,不然要能达不到想要的单例效果,还可能引发死锁等。因此在使用懒汉式单例模式时一定要对同步有所了解,不过使用饿汉式单例模式就可以避免这个问题。
子类破坏了对象控制
如果构造器变得不再私有,就有可能失去对对象的控制
串行化(可序列化)
为了使一个单例类变成可串行化的,仅仅在声明中添加“implements Serializable"是不够的,因为一个串行化的对象在每次反串行化的时候,都会创建一个新的对象,而不仅仅是一个对原有对象的引用,为了防止这种情况,可以在单例类中加入readResolve方法
public final class Singleton implements Serializable{ private Singleton () { } private static final Singleton INSTANCE = new Singleton (); public static Singleton getInstance() { return INSTANCE; } private Object readResolve() throws ObjectStreamException { return INSTANCE; } }
对象的反串行化并不仅局限于上述方式,还存在基于 XML模式的对象串行化方式,这种方式也存在上述的问题,所以在使用的时候还要格外小心。
原文:http://lgh3292.iteye.com/blog/585037
设计模式之略见一斑(单例模式singleton)相关推荐
- Net设计模式实例之单例模式( Singleton Pattern)
一.单例模式简介(Brief Introduction) 单例模式(Singleton Pattern),保证一个类只有一个实例,并提供一个访问它的全局访问点.单例模式因为Singleton封装它的唯 ...
- HeaFirst设计模式-单件模式[单例模式](Singleton Pattern)
深入分析单件模式 本次主要介绍的内容有 单件模式 单线程下的单件模式实现 多线程下实现单件模式出现的问题分析 JMM内存模型 多线程下的单件模式实现的三种方式 这些内容,可以从最根本理解单例模式的代码 ...
- JavaScript设计模式 Item 6 --单例模式Singleton
单例模式的定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 单例模式是一种常用的模式,有一些对象我们往往只需要一个,比如线程池.全局缓存.浏览器的window对象.在js开发中,单例模式的 ...
- java设计模式 单例_java设计模式一(单例模式singleton)
1 概述 如果要保证系统里一个类最多只能存在一个实例时,我们就需要单例模式.这种情况在我们应用中经常碰到,例如缓存池.数据库连接池.线程池.一些应用服务实例等.在多线程环境中为了保证实例的唯一性其实并 ...
- 【设计模式笔记】单例模式Singleton Pattern
单例模式是比较简单的一个模式,项目中也经常用得到. 实现细节 将类的构造方法设置为私有的(private),通过个公有的(public)的方法来获取类的实例. 代码示例 public class Si ...
- 《研磨设计模式》chap5 单例模式singleton
1. 模式介绍 1.1 饱汉式单例实现 public class Singleton {//定义一个变量来存储创建好的类实例 private static Singleton uniqueInstan ...
- JAVA设计模式Design Pattern→单例模式Singleton Pattern、工厂模式Factory Pattern、代理模式Proxy Pattern
私有化构造函数的类可以提供相应的 "接口"(一般就是静态方法)来返回自己的唯一实例供外部调用,像这样的确保只生成一个实例的模式被称作单例模式. 工厂模式,一个模型,用来大规模的生产 ...
- Android设计模式——单例模式(Singleton)
二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元 ...
- 设计模式之单例模式——Singleton
设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有 ...
最新文章
- 智源学者朱军获2020年“科学探索奖”
- detime php_php试题及答案
- 【若依(ruoyi)】弹框图标 / layer 图标
- SQL注入-SQL注入的WAF绕过(十六)
- android抽奖动画,Android App中实现简单的刮刮卡抽奖效果的实例详解
- MVC @RenderBody、@RenderSection、@RenderPage、@Html.RenderPartial、@Html.RenderAction
- Linux 下 ascii 的查看方式
- c语言四个零,输入任意四个整数(0到10),运算符只有加减乘除,还有括号.每个数只能且必须用一次。要求判断这些表达的结果中是否有24。如果有,输出计算表达式:如输入4,6,1...
- VS-c++ 项目新建文件夹
- 二分之一波长传输线有啥用?
- ElasticSearch 图片搜索插件 (一)
- 把电脑做成服务器系统,把电脑做成云盘服务器
- 云计算的运营方式有哪些?
- 这家机场扶梯安装“智能管家”,扶梯消毒仪现高招,绝了!
- php中如何过滤关键字,PHP - 过滤关键字
- 淘淘商城第39讲——使用Spring来管理单机版Redis与集群版Redis
- 导航栏保持居中并使用swiper作为轮播图进行背景轮播背景
- Gradle自定义AAR文件名称
- 火山视窗文本数组类增删查改操作
- 职业价值观确认表? What is really important to you?