黑马程序员--------单例设计模式
来源:互联网 发布:淘宝客户运营平台 编辑:程序博客网 时间:2024/05/28 05:19
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一. 为什么要使用单例设计模式?
可以保证一个类在内存中的对象唯一性。
比如,程序读取一个配置文件的时候,就可以把配置为文件封装成对象。当要求方便的操作其中的数据,又要保证多个程序读到的是同一个配置文件对象,就需要这个配置文件对象在内存中是唯一的
二. 怎样保证对象唯一性呢?
思路:
1. 让本类的构造函数私有化,这样其他的类就不可以创建本类对象。
2. 在本类中创建一个私有的本类对象。
3. 对外提供方法,让其他的类可以获取这个对象。
3. 单例设计模式的分类:
单例设计模式有两种,一种是懒汉设计模式(又称为延迟加载设计模式),一种是饿汉设计模式。
饿汉设计模式的代码体现如下:
class Single{ //私有本类中的构造函数 private Single(){} //创建本类对象 private static Single s= new Single(); //对外提供获取本来对象方法 public static Single getInstance() { return s; }}注意问题:
由于外界无法创建Single对象,没有对象,那就无法调用getInstance方法,这时需要将getInstance方法静态化,这样外界就可以通过类名直接调用该方法。
懒汉模式:
public class SingleDemo{ public static voidmain(String[] args) { //获取Single类的实例对象s Single s = Single.getInstance(); //获取Single类的实例对象s2 Single s2 = Single.getInstance(); System.out.println(s==s2); //true }}class Single{ //私有构造函数 private Single(){} //在本类中创建本类对象 private static Single instance = null; //对外提供静态访问方法,获取本类实例对象 public static Single getInstance() { if(instance == null ) // 这里会有线程安全问题 { instance = new Single(); } return instance; } }
三,总结:
懒汉模式,它的特点是运行时获得对象的速度比较慢,但加载类的时候比较快。它在整个应用的生命周期只有一部分时间在占用资源。
饿汉模式,它的特点是加载类的时候比较慢,但运行时获得对象的速度比较快。它从加载到应用结束会一直占用资源。
从用户体验的角度来说,我们应该首选饿汉模式。我们愿意等待某个程序花较长的时间初始化,却不喜欢在程序运行时等待太久,给人一种反应迟钝的感觉,所以对于有重量级对象参与的单例模式,我们推荐使用饿汉模式
在并发的情况下,懒汉式是不安全的。如果两个线程,我们称它们为线程1和线程2,在同一时间调用getInstance()方法,如果线程1先进入if块,然后线程2进行控制,那么就会有两个实例被创建。
四,懒汉设计模式缺陷的解决方案:我们可以使用线程锁来解决这个问题,代码反映如下:
class Single{ //私有构造函数 private Single(){} //在本类中创建本类对象 private static Single instance = null; //对外提供静态访问方法,获取本类实例对象 public static Single getInstance() { if(instance == null) { synchronized(Single.class) { if(instance == null ) { instance = new Single(); } } } return instance; } }
- 黑马程序员_单例设计模式
- 黑马程序员_单例设计模式
- 黑马程序员 单例设计模式
- 黑马程序员_单例设计模式
- 黑马程序员_单例设计模式
- 黑马程序员-单例设计模式
- 黑马程序员---单例设计模式
- 黑马程序员:单例设计模式
- 黑马程序员-单例设计模式
- 16.黑马程序员-设计模式-单例
- 黑马程序员_单例设计模式
- 《黑马程序员》单例设计模式
- 黑马程序员_java 单例设计模式
- 黑马程序员--单例设计模式
- 黑马程序员---单例设计模式【java】
- 黑马程序员-单例设计模式
- 黑马程序员—单例设计模式
- 黑马程序员_单例设计模式
- iOS 富文本类库RTLabel
- iostat来对linux硬盘IO性能进行了解
- Cocos架构和目录结构
- ios项目代码编写规范
- linux ssh免密码登录
- 黑马程序员--------单例设计模式
- hdu2639——Bone Collector II——————【01背包、第k优解】
- JAVA标准系列(java规范)
- iOS初学者超级头疼的CollectionView学习
- 【Python学习记录】2015-01-27
- jvm 生成javacore和heapdump文件
- linux apt-get 安装 jdk
- JVM监控工具-Jconsole
- 磁盘IO满负荷性能分析