单例模式
2016-03-17 13:11
281 查看
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">一、定义:确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。</span>
二、表现形式:1、饿汉式单例类:类加载时,就进行对象实例化
2、懒汉式单例类:第一次引用类时,才进行对象实例化
饿汉式:
package singleton; public class EHanSingleton { private static EHanSingleton e_instance=new EHanSingleton(); //类被加载时e_instance会被初始化 private EHanSingleton()//构造函数是private的,避免外界利用构造函数直接创建新的其他实例 { } public static EHanSingleton getInstance() { return e_instance; } }懒汉式:
package singleton; public class LHanSingleton { private static LHanSingleton l_instance=null;//没有调用前不会实例化LHanSingleton private LHanSingleton()//构造函数是private的,避免外界利用构造函数直接创建新的其他实例 { } synchronized public static LHanSingleton getInstance(String name) { if(l_instance==null) { l_instance=new LHanSingleton();//第一次调用时实例化 } System.out.println(name+":访问懒汉式"); return l_instance; } }
三、两者的区别:1、饿汉式在类加载时实例化,懒汉式在第一次引用时实例化
2、资源利用效率(饿汉式<懒汉式),速度和反应时间(饿汉式>懒汉式)
四、优缺点
优点:1、减少了内存的开支
2、减少了系统的性能开销
3、避免对资源的多重占用
4、可以在系统设置全局的访问点,优化和共享资源访问
缺点:1、无法创建子类,扩展困难,只有通过修改代码进行扩展
2、对测试不利
3、与单一职责原则有冲突
五、使用场景
1、要求生成唯一序列号的环境
2、需要共享访问点或共享数据
3、创建对象系需要消耗大量资源
4/需要定义大量静态变量和方法的环境
六、注意事项
1、注意有状态和无状态单例类的使用场景,则单例类是否具有唯一序列号对系统的影响(在分布式系统)
2、单例类不能实现Serializable或Cloneable接口,否则可能被反序列化或克隆出一个新的实例来。
七、应用测试
1、通过线程访问单例类
package singleton; public class MyThread extends Thread { private String threadname; public MyThread (String name) { threadname=name; } public void run() { LHanSingleton instance =LHanSingleton.getInstance(threadname); //EHanSingleton instance1 =EHanSingleton.getInstance(); try { this.sleep(1000); } catch(Exception e) { e.printStackTrace(); } } }测试类
package singleton; public class Test { public static void main(String[] args) { int times=0; while(times<10) { MyThread thread1=new MyThread("线程1"); MyThread thread2=new MyThread("线程2"); thread1.start(); thread2.start(); times++; } } }
测试结果:
线程2:访问懒汉式
线程1:访问懒汉式
线程1:访问懒汉式
线程1:访问懒汉式
线程1:访问懒汉式
线程2:访问懒汉式
线程1:访问懒汉式
线程1:访问懒汉式
线程2:访问懒汉式
线程2:访问懒汉式
线程1:访问懒汉式
线程2:访问懒汉式
线程2:访问懒汉式
线程1:访问懒汉式
线程2:访问懒汉式
线程2:访问懒汉式
线程1:访问懒汉式
线程1:访问懒汉式
线程2:访问懒汉式
线程2:访问懒汉式
相关文章推荐
- Jenkins——扫盲篇(Jenkins是什么)
- 第一次系统开发记录过程
- R语言apply函数族笔记
- C++中一个关于复制构造函数和指针的问题
- apk签名过程
- 关于公示编辑器写的公式在word文档中位置总是偏上解决办法。
- Android工程师进阶之路 :《Android开发进阶:从小工到专家》上市啦!
- Centos6.X下安装php nginx mysql 环境
- Paxos算法(转自维基百科)
- Asp.net MVC 与 Asp.net Web API 区别
- ios蓝牙开发 ------ CoreBluetooth 教程<转>
- 在linux 中去除^M字符
- ios ffmpeg加字幕
- ASP.Net MVC4排序检索分页的实现
- ASP.NET MVC 缓存使用示例
- sprinvMVC路径拦截
- php中的get_called_class()方法
- Python代码优化及技巧笔记(二)
- HTML 5 视频(video)
- 通过composer发布自己的包