单例模式:
单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这样的类就称为单例类。
单例模式的要点有三:
1) 某个类只能有一个实例。
2)它必须自行创建这个实例
3)它必须自行向整个系统提供这个实例。
应用场景:比如系统的日志记录,所有关联的日志都需要记录在一个文件中,此时就需用到单例模式。
单例模式的简单实现:
class Singleton {
private static Singleton instance;
//以保证向整个类提供这个实例
public static Singleton getInstance() {
if(instance == null) {
return new Singleton();
}
return instance;
}
}
第二种实现:java在实现多线程的单例模式时,系统最好先初始化Singleton的实例。
class Singleton {
private static Singleton instance = new Singleton();
public static Singleton getInstance() {
return instance;
}
}
单例模式的优势和缺陷:
优点:为一个应用程序提供对象的唯一访问点,此种模式为设计及开发团队提供了共享的概念。
缺点:单例类对派生子类有很大的困难,只有在父类没有被实例化时才可以实现。
单例类应该注意的地方:
1)有些对象不能作为单例类对象,比如数据库连接对象。
2)如果实例化的对象长时间不被利用,系统会认为它是废物,自动消灭并回收它的资源,下次利用时又会重新实例化,这种情况下,应该注意其状态的丢失。
3)单例类在多线程时应该注意的问题:
我们来分析一下:
若在多线程中,1号线程确定了instance为null并调用getInstance方法来实例化一个新对象,但是在实例化完成之前,2号线程抢占了,也调用getInstance方法并发现instance为null,显然它又会new一个新对象。此时 我们就有两个对象了。违反了单例类得到一个实例的原则。
解决方法:
用synchronized加一层保护代码:
class Singleton {
private static Singleton instance;
//以保证向整个类提供这个实例
public static Singleton getInstance() {
if(instance == null) {
synchronized(Singleton.class) {//1
if(instance == null) {//2
return new Singleton();//3
}
}
}
return instance;
}
}
此时我们再来分析:
当1号线程运行到//1时,获得同步锁,此时若1号线程被2号线程占用,由于instance仍未null,因此2号线程试图获得1号线程的同步锁,但此时由于1号线程仍持有该锁,2号线程被阻塞,则2号线程会被1号线程占据,1号线程再判断instance为null,因此运行到//3实例化一个新对象,并将其引用值赋给instance,1号线程退出synchronized块并返回一个instance实例,1号线程被2号线程抢占,2号线程运行//2判断instance不为null,因此不会再创建一个新对象。
然而,理论虽理想,但现实中确会遇到问题:并不能保证在单处理器或多处理器上能正确运行。
此处:详情请见:http://blog.csdn.net/kufeiyun/article/details/6166673
最后说一下单例模式的应用场景:
1 系统只需要一个实例对象。
2 客户调用类的单个实例只允许使用一个公共访问点。
分享到:
相关推荐
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个...
4、单例模式(Singleton Pattern) 用意:仅允许生成一个对象时
主要为大家详细介绍了C#单例模式Singleton Pattern的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
Singleton pattern单例模式应用
3、单例模式SINGLETON PATTERN 4、多例模式MULTITION PATTERN 5、工厂方法模式FACTORY METHOD PATTERN 6、抽象工厂模式ABSTRACT FACTORY PATTERN 7、门面模式FACADE PATTERN 8、适配器模式ADAPTER PATTERN 9、模板...
单例模式 Singleton Pattern 问题解决: (1)单例模式简介: Singleton模式要求一个类有且仅有一个实例,并且提供了一个全局的访问点。这就提出了一个问题:如何绕过常规的构造器,提供一种机制来保证一个类只有...
NULL 博文链接:https://lym6520.iteye.com/blog/695374
主要介绍了C#单例模式(Singleton Pattern)的实现方法,主要讲述了即时加载的单例模式、延迟加载的单例模式与线程安全的单例模式,需要的朋友可以参考下
单例模式(Singleton Pattern) 保证整个系统中,对于某个对象,只能存在一个对象实例,该类值提供一个获取器对象的方法 当我们频繁的创建和销毁对象,会消耗大量资源,当我们使用对象通过new,将产生大量的对象实例,而单例...
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 学习demo
什么是单例模式 单例就是单个对象的意思,指在系统运行期间,一个类最多只能创建一个对象,且该类能自行创建这个对象的一种编码设计模式。 单例模式有两个特点: 在系统的整个生命周期内,单例对象最多只能有一个 ...
单例模式(Singleton Pattern)是设计模式中最简单的模式之一,属于创建型模式。这种设计模式主要是类的对象只有一个实例,不需要每次new 创造。而我们要做的的就是确保这个对象创建的唯一。然后根据一些特征进行...
单例模式(Singleton Pattern)是指确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点。单例模式属于创建型模式 单例模式的常见写法 一、饿汉式单例 顾名思义饿汉式单例是在类加载的时候就立即初始化...
单例模式(Singleton Pattern)是 Java 中最常见的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
单例模式(Singleton Pattern)作为创建型模式中的一种,旨在确保一个类在系统中只有一个实例,并提供全局访问点。
单例模式[SINGLETON PATTERN] 多例模式[MULTITION PATTERN] 工厂方法模式[FACTORY METHOD PATTERN] 抽象工厂模式[ABSTRACT FACTORY PATTERN] 门面模式[FACADE PATTERN] 适配器模式[ADAPTER PATTERN] 模板方法模式...