单例模式应该是23种设计模式中最简单的一种。这里的简单我觉得应该是代码实现上的简单和思维的简单:类只提供一个全局变量。但是虽然简单,但若仔细研究,亦有万千变化,深藏奥妙。
1. 定义:
单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
这个类称为单例类
2. 单例模式 特点
a. 单例类只可有一个实例
b.单例类必须自己创建自己这惟一的实例
c.单例类必须给所有其他对象提供这一实例
1. 一个简单的单例模式
/** * 实现最简单的单例模式 */ public class SimpleSingleton { private static final SimpleSingleton singleton = new SimpleSingleton();//变量为static,final private SimpleSingleton(){};//构造方法声明为私有,这样就保证了只能有一个对象存在 //提供一个外部得到类的方法 public static SimpleSingleton getInstance(){ return singleton; } }
上面的代码目测存在两个问题:1. 不管singleton会被使用都是会被创建
2. 尽管构造器被定义为private,但是利用java的反射类仍然是会被实例化
2. 做一个优化吧
/** * 做了些许优化的单例模式 */ public class LazySingleton { private static LazySingleton singleton = null;//不再做实例化操作 private LazySingleton(){};//构造方法声明为私有,这样就保证了只能有一个对象存在 //提供一个外部得到类的方法 public static LazySingleton getInstance(){ //这里做一个判断,当对象为null时才初始化 if(null==singleton){ singleton = new LazySingleton(); } return singleton; } }
上面的代码目测存在一个问题就是线程安全的问题。就是如果多个地方同时调用getInstance方法。有可能,存在if的判断的已经通过,但是还没来得及调用new 方法,下一个调用又进来,这样也会进入到if的代码块中,导致会new 出来多个对象。
关于线程安全问题
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题
3. 再优化一下,加上synchronized
/** * 做了些许优化的单例模式 */ public class LazySingleton { private static LazySingleton singleton = null;//不再做实例化操作 private LazySingleton(){};//构造方法声明为私有,这样就保证了只能有一个对象存在 //提供一个外部得到类的方法 public synchronized static LazySingleton getInstance(){ //这里做一个判断,当对象为null时才初始 if(null==singleton){ singleton = new LazySingleton(); } return singleton; } }
但是如果太多的synchronized会涉及到性能问题,所以要改变加锁的位置
/** * 做了些许优化的单例模式 */ public class LazySingleton { private static LazySingleton singleton = null;// 不再做实例化操作 private LazySingleton(){};// 构造方法声明为私有,这样就保证了只能有一个对象存在 // 提供一个外部得到类的方法 public synchronized static LazySingleton getInstance() { if (null == singleton) { //锁加在这里 synchronized (LazySingleton.class) { if (null == singleton) { singleton = new LazySingleton(); } } } return singleton; } }
参考源文档<http://blog.csdn.net/gf771115/article/details/9031269>,此处致谢
相关推荐
Python 115.设计模式_单例模式实现.mp4
计算机后端-Java-Java核心基础-第15章 面向对象07 14. 设计模式与单例设计模式.avi
1.模式定义/应用场景/类图分析 2.字节码知识/字节码指令重排序 3.类加载机制 4.JVM序列化机制 5.单例模式在Spring框架 & JDK源码中的应用
设计模式之单例模式 设计模式之单例模式 设计模式之单例模式
java设计模式之单例模式
项目中合理地运用设计模式可以完美地解决很多问题,每种模式在现实中都有相应的原理来与之对应,每种模式都描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是设计模式能被广泛应用的原因。
单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。 许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。 比如在某个服务器程序中,该服务器的配置信息存放...
是http://blog.csdn.net/lxq_xsyu/article/category/1544127博客中java设计模式的源代码。下载前请先看《设计模式——单例模式》一文。
细心整合和单例模式和工厂模式的几种模型,懒汉式,饿汉式,如何并发操作模式,等都有详细讲解
C++单例设计模式,单例模式 C++单例设计模式,单例模式
李建忠老师的设计模式-单例模式讲解,示例以C++编程语言呈现。
设计模式之单例模式 懒汉式,饿汉式,同步枷锁
JAVA设计模式之单例模式。 一篇文章带你快速了解!
为了帮助大家快速和较好地理解JavaScript设计模式中的单例模式,本文对JavaScript的单例模式进行了分析并进行简易的代码演示,希望本文能够给有需要的人带来一点小小的帮助。
php设计模式之单例模式_.docx
入名所示,该文件为最详细的Java单例模式讲解并附有讲解代码。主要讲了单例模式的几种方法,懒汉模式、饿汉模式、静态内部类模式。着重讲解了懒汉模式下怎么实现线程安全。饿汉模式和静态内部类模式如何设置能够避免...
设计模式-单例模式 学习时候联系的代码,可以进行参考
NULL 博文链接:https://xieyan30.iteye.com/blog/1695483
目录 单例模式的概念 单例模式的要点 单例模式类图 单例模式归类 单例模式的应用场景 单例模式解决的问题 单例模式的实现方式 单例模式实现方式对比 单例模式的概念 单例模式,顾名思义就是只有一个实例,并且由它...