Singleton 单例模式(懒汉方式和饿汉方式)
2016-01-31 21:55
295 查看
转载的一篇文章,原文 :Singleton 单例模式(懒汉方式和饿汉方式)
笔者总结如下
懒汉 类加载的时候不初始化,需要同步
饿汉 类加载时候就已经完成了初始化,不需要同步
个人推荐饿汉,空间换时间,浪费一点空间储存初始化过的变量
单例模式的概念:
单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。
关键点:
1)一个类只有一个实例 这是最基本的
2)它必须自行创建这个实例
3)它必须自行向整个系统提供这个实例
—————————————————————————————————————————————————-
两种实现方式:
1 懒汉模式(类加载时不初始化)
关键点:(代码注释上已给出)
1)构造函数定义为私有—-不能在别的类中来获取该类的对象,只能在类自身中得到自己的对象
2)成员变量为static的,没有初始化—-类加载快,但访问类的唯一实例慢,static保证在自身类中获取自身对象
3)公开访问点getInstance: public和synchronized的—–public保证对外公开,同步保证多线程时的正确性(因为类变量不是在加载时初始化的)
优缺点见代码注释。
2 饿汉式单例模式(在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快)
关键点:(代码注释已写)
1)私有构造函数
2)静态私有成员–在类加载时已初始化
3)公开访问点getInstance—–不需要同步,因为在类加载时已经初始化完毕,也不需要判断null,直接返回
优缺点见代码注释。
————————————————————————————————————————————————–
关于单例模式跟全局变量有什么区别,似乎也可以提供一个public的类变量和一个private的构造函数实现类似的功能。
查了下资料,还没搞的十分明白,望各位达人解答。。。
笔者总结如下
懒汉 类加载的时候不初始化,需要同步
饿汉 类加载时候就已经完成了初始化,不需要同步
个人推荐饿汉,空间换时间,浪费一点空间储存初始化过的变量
单例模式的概念:
单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。
关键点:
1)一个类只有一个实例 这是最基本的
2)它必须自行创建这个实例
3)它必须自行向整个系统提供这个实例
—————————————————————————————————————————————————-
两种实现方式:
1 懒汉模式(类加载时不初始化)
package Singleton; public class LazySingleton { //懒汉式单例模式 //比较懒,在类加载时,不创建实例,因此类加载速度快,但运行时获取对象的速度慢 private static LazySingleton intance = null;//静态私用成员,没有初始化 private LazySingleton() { //私有构造函数 } public static synchronized LazySingleton getInstance() //静态,同步,公开访问点 { if(intance == null) { intance = new LazySingleton(); } return intance; } }
关键点:(代码注释上已给出)
1)构造函数定义为私有—-不能在别的类中来获取该类的对象,只能在类自身中得到自己的对象
2)成员变量为static的,没有初始化—-类加载快,但访问类的唯一实例慢,static保证在自身类中获取自身对象
3)公开访问点getInstance: public和synchronized的—–public保证对外公开,同步保证多线程时的正确性(因为类变量不是在加载时初始化的)
优缺点见代码注释。
2 饿汉式单例模式(在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快)
package Singleton; public class EagerSingleton { //饿汉单例模式 //在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快 private static EagerSingleton instance = new EagerSingleton();//静态私有成员,已初始化 private EagerSingleton() { //私有构造函数 } public static EagerSingleton getInstance() //静态,不用同步(类加载时已初始化,不会有多线程的问题) { return instance; } }
关键点:(代码注释已写)
1)私有构造函数
2)静态私有成员–在类加载时已初始化
3)公开访问点getInstance—–不需要同步,因为在类加载时已经初始化完毕,也不需要判断null,直接返回
优缺点见代码注释。
————————————————————————————————————————————————–
关于单例模式跟全局变量有什么区别,似乎也可以提供一个public的类变量和一个private的构造函数实现类似的功能。
查了下资料,还没搞的十分明白,望各位达人解答。。。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树