单例模式
来源:互联网 发布:php xmlreader详解 编辑:程序博客网 时间:2024/06/13 10:19
案例
//基于线程安全的单例类public class SingleTon { //直接从内存中读取当前对象,确保其最新(唯一) private volatile static SingleTon instance; //限制产生多个对象 private SingleTon(){} public static SingleTon getInstance(){ //第一次判断当前对象是否为null,意图减少多个线程对当前类上锁、释放锁的开销 if(instance == null){ synchronized (SingleTon.class) { //第二次判断当前对象是否为null,确保其唯一性 if(instance == null ){ instance = new SingleTon(); } } } return instance;} public static void show(SingleTon singleTon){ System.out.println("我们都有一个家,名字叫:"+singleTon); }}
//测试类public class Test { public static void main(String[] args) { for(int i=0;i<3;i++){ SingleTon singleTon = SingleTon.getInstance(); singleTon.show(singleTon); } }}
测试结果:我们都有一个家,名字叫:singleton.SingleTon@207c15c0我们都有一个家,名字叫:singleton.SingleTon@207c15c0我们都有一个家,名字叫:singleton.SingleTon@207c15c0
优点
- 减少内存开支
- 减少系统性能开销
- 避免对资源的多重占用
- 可以在系统设置全局访问点,优化和共享资源访问(如:可设计一个单例类,负责所有数据表的映射处理)
缺点
- 单例模式一般没有接口,不易扩展,除修改代码外基本没有第二种方式实现
- 单例模式对测试是不利的。在并行开发环境中,如果单例模式没有完成,是不能进行测试的,没有接口也不能使用 mock 的方式虚拟一个对象
- 单例模式与单一职责原则有冲突
使用场景
- 要求生成唯一序列号的环境
- 创建一个对象需要消耗的资源过多,如:访问IO、数据库等资源
- 在整个项目中需要一个共享数据,如:Web页面中的计数器,可以不用每次都将其记录到数据库中,通过线程安全的单例模式保持计数器的值
- 需要定义大量的静态常量和静态方法(如工具类)的环境,可以采用单例模式(也可直接声明为static)
0 0
- 单例、单例模式
- 单例模式-多线程单例模式
- 单件模式(单例模式)
- 设计模式------单例模式
- 设计模式------单例模式
- 设计模式-单例模式
- 设计模式 - 单例模式
- 设计模式---单例模式
- 设计模式---单例模式
- PHP模式-单例模式
- 【设计模式】单例模式
- 设计模式-单例模式
- 设计模式----单例模式
- 设计模式--单例模式
- 设计模式-单例模式
- 单例模式(单子模式)
- 设计模式-单例模式
- [设计模式] 单例模式
- ie7问题
- bean的延迟加载
- 卷积物理意义 卷积最简单解释
- C++ STL--vector容器整理
- vi的基本使用
- 单例模式
- JavaSocket通信--BIO,NIO,AIO
- 记一次PIP执行出错--UnicodeDecodeError: 'ascii' codec can't decode byte 0xb1 in position 9: ordinal
- C++ 如何 int 转 string
- accuracy_layer
- 使用js创建div、添加子div并给div设置在css中定义的class选择属性以及设置style属性
- 自己做的很好用不卡顿的弹幕View
- 如何学习一门计算机语言
- Keil如何提升性能和减小代码大小