设计模式——单例模式
来源:互联网 发布:淘宝借贷平台 编辑:程序博客网 时间:2024/06/05 11:04
单例模式
一、什么是单例模式:
单例模式是一种对象创建形模式,使用单例模式,可以保证为一个类只生成唯一的实例对象。也就是说,在整个程序空间中,该类只存在一个实例对象。
其实,GoF对单例模式的定义是:保证一个类、只有一个实例存在,同时提供能对该实例加以访问的全局访问方法。
二、为什么要使用单例模式:
在应用开发中,我们常常有以下 需求:
1、在多个线程之间,比如servlet环境,共享同一个资源或者操作同一个对象
2、在整个程序空间使用全局变量,共享资源
3、大规模系统中,为了性能的考虑,需要节省对象的创建时间等等。
因为Singleton模式可以保证为一个类只生成唯一的实例对象,所以这些情况,Singleton模式就派上用场了。
三、单例模式实现
1.饿汉式。
2.懒汉式。
3.双重检查。
四、实现
假如我们要得到一个对象的实例,通常是这么做的:
要实现单例,必须私有化构造函数,你可能会想到这么实现单例:
这样在每次使用该类的静态方法得到实例的时候都会创建一个新实例,这显然不是单例!,下面我们就用饿汉式来实现单例模式。
上面这种就是饿汉式,下面我们再看一下怎么用懒汉式来实现:
饿汉式在类加载的时候就创建了对象的实例,而懒汉式是在调用提供实例的静态方法时才创建(延迟加载)。那么上面的懒汉式是否能保证只提供一个实例?答案是在单线程下是肯定的,但是在多线性下就不能保证了。
如何解决懒汉式在多线程下的问题呢,使用同步方法,请看下面代码:
上面的方法虽然解决了懒汉式多线程下的单例模式,但是还不够好,因为我们只需要同步创建实例的语句,而不需要同步整个方法,当第一个线程进来后person==null然后创建实例、第二个线程进来后person!=null就不会创建实例。所以只需同步person = new Person().这样可以提高程序的运行效率。这样做就没有问题了吗?答案是“no"
当第一个线程执行到person==null后进入同步块,执行person=new Person()的时候第二个线程判断person==null,这时候当第一个线程执行完new Person()后第二个线程紧接着会执行new Person().
怎么解决这个问题呢?要效率还是要安全?????
齐声说“都要!!!!!”
我们发现这样做只所以能够提供效率是因为if(){ }中的语句只会被执行一次,那么我们为何不再给加个判断呢?
这就是所谓的双重检查.源代码下载:http://download.csdn.net/detail/lxq_xsyu/5907381
0 0
- 设计模式—单例设计模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- socket编程基于IO复用的多客户端服务器
- emacs修改键盘映射
- 安装java,tomcat遇到的问题
- spring 和mybatis整合时 使用context:property-placeholder载不进属性 还报org.springframework.beans.factory.BeanCrea
- Launcher3源码浅析(5.1)--OverviewMode
- 设计模式——单例模式
- 进程与线程的区别
- C++编程基础笔记章节三
- http://liubin.org/promises-book/
- Android Studio 修改项目包名(Xposed)
- 一个简单的线程池(仿java的ScheduledFuture)
- 文件描述符的本质
- 事件分发之ViewGroup.dispatchTouchEvent(Android5.0)
- tomcat7-maven-plugin使用