关于单实例模式的认识
来源:互联网 发布:java编写九九乘法表 编辑:程序博客网 时间:2024/06/05 23:36
实现1:
public class Singleton {
private static Singleton instance;
private Singleton (){ //首先有一个私有的构造器
}
public static Singleton getInstance() {
if(instance==null){
instance=new Singleton ();
}
return instance;
}
}
这种方式是线程不安全的,如果多个线程同时访问的话就可能有多个对象产生,如果在get方法中加同步块的话会影响性能。
实现2:
public class Singleton {
private Singleton(){
}
private static Singleton instance =new Singleton();
public static Singleton getInstance(){
return instance;
}
}
这种方式虽然不存在安全性问题,但是在程序启动的时候就会初始化。
实现3:
public class Singleton {
private static class SingletonHolder {
static Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
}
3种方式中这是最好的解决方案,既解决了线程同步的问题,有在调用的时候才初始化。
同时也有仁兄这样评论:
人云亦云!误人子弟!什么叫“程序启动”?你这个Singleton中只有一个public方法,那么这个类的初始化只有两种可能:
1)、使用Class.forName(),此时会实行static语句。
2)、调用getInstance()方法。
那么只有1)是有性能问题的(你可能加载并初始化了这个类,但没有使用它,然而这种情况很少)。
至于2),是不存在性能问题的(因为只有这1个public方法,所以只有这个方法在第一调用时才初始化实例)
第三种方式是最好的的,但通常第二种方式都是简单可行的。
在评论之前首先要知道几个概念:
1.单实例模式是解决什么问题(为什么要用 单实例)
2.创建单实例会有哪些问题
3.怎么创建它,使它最为合理
经过测试和咨询资深java工程师得知以下方式是最好的,最实用的:
* 满足标准单实例的四个要素:
* 1.该类必须是final类型
* 2.必须要有一个私有的、静态的、final类型的一个该类的对象
* 3.构造方法必须私有
* 4.必须要有一个公有的、静态的、返回该单实例的一个对象的方法
*/
public final class Singleton
{
private static final Singleton instance=new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}
参考:
1.http://dxblyq3320.iteye.com/blog/445100
2.内部资料
3.http://wushuangyan26.iteye.com/blog/1327985
- 关于单实例模式的认识
- 单实例的模式
- 关于拉模式的认识
- 单实例模式的实现
- 黑马程序员————IOS学习笔记 第12篇 关于单例设计模式的认识
- 关于对设计模式的一点认识
- 关于软件工程团队模式的粗浅认识
- 深入认识单例模式
- 单例模式的理解认识 练习笔记
- 十分钟认识单例模式的多种姿势
- 静态内部类的一些认识---->单例模式
- 单实例设计模式的实现
- 单件模式的两个简单实例
- 单实例设计模式的实现
- 单实例设计模式的实现
- 单实例设计模式的实现
- 单实例设计模式的实现
- 单实例设计模式的实现
- Linux平台下物理DG部署
- hdu1232 畅通工程
- Android - LayoutInflater
- CSP编程基础--CryptAPI使用过程中碰到的问题
- Mastering Regular Expression 代码介绍 1 - HTML 格式转换
- 关于单实例模式的认识
- CONTAINING_RECORD
- 【反射】Reflect的使用
- solr 常用UI请求
- Customizing Android ListView Items with Custom ArrayAdapter
- C# char[] 与 string之间的转换
- 传Facebook与HTC合作开发手机 预计明年中发布
- JTAG与ISP区别
- umask 函数