单例模式
2015-11-29 13:09
211 查看
原理:
字面意义:一个类只有一个对象,仅提供一个全局访问点。
其它类似解决方案:
1.静态变量
2.程序员间协商全局变量
特点:
a.单例类只能有一个实例。
b.单例类必须自己创建自己的唯一实例。
c.单例类必须给所有其他对象提供这一实例。
应用:
1. Windows的Task Manager(任务管理器)就是很典型的单例模式,只能打开一个。
2. windows的Recycle Bin(回收站)也是典型的单例应用。
3.
网站的计数器,一般也是采用单例模式实现,否则难以同步。
4. Web应用的配置对象的读取。这个是由于配置文件是共享的资源。
5.
数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。数据库软件系统中使
用数据库连接池,主要是节省打开或者关闭数据库连接所引起的效率损耗,这种效率上的损耗还是非常昂贵
的,因为何用单例模式来维护,就可以大大降低这种损耗。
6.
多线程的线程池的设计一般也是采用单例模式,这是由于线程池要方便对池中的线程进行控制。
7.
操作系统的文件系统,也是大的单例模式实现的具体例子,一个操作系统只能有一个文件系统。
单例模式三种实现方式:
1.第一种形式: 饿汉式单例类(类加载时就初始化) public class Singleton { private Singleton(){} private static Singleton instance = new Singleton(); public static Singleton getInstance() { return instance; } }2.第二种形式:懒汉式单例类 (调用时初始化)
<span style="font-size:18px;">public class Singleton { private Singleton(){} private static Singleton instance = null; public static synchronized Singleton getInstance() { if (instance==null)instance=new Singleton(); return instance; }</span>3.登记式单例类
登记式单例类是为了克服饿汉式单例类和懒汉式单例类不可继承的缺点而设计的。
代码略
优化:
对多线程问题的解决
1.同步锁
在访问点方法上加synchronized,消耗资源
2.静态对象直接赋值(饿汉模式)
浪费了内存
3.双重检查加锁法
在实例对象前家关键字(volatile)
<span style="font-size:18px;">if(instance != null){ synchronized(Single.class){ if(instance != null){ instance = new Single(); } } return instance; }</span>
相关文章推荐
- js小时钟
- Android AutoLayout全新的适配方式 堪称适配终结者
- OpenCV中debug与release的问题
- 1.交通聚类:编辑距离 (Levenshtein距离)Java实现
- iOS中的#import和class区别
- 南大软院大神养成计划第十四天
- 快速排序
- Android 开源框架Universal-Image-Loader完全解析(三)---源代码解读
- 企业汇报系统细节追加(三)
- 计算机技术领域当前的主流技术及其社会需求调查报告
- Android 开源框架Universal-Image-Loader完全解析(二)--- 图片缓存策略详解
- 程序员技术练级攻略
- 谈谈Java程序员进阶的那些知识和方向
- Android 开源框架Universal-Image-Loader完全解析(一)--- 基本介绍及使用
- ubuntu 安装配置samba服务器
- UESTC 761 LoveZx与期末考试
- “滑机约拍”--第二阶段冲刺(2)
- 用CSS做长度超过长度显示‘...’,当鼠标放上时显示全部内容
- java中的堆、栈和常量池
- leetcode Search a 2D Matrix