黑马程序员技术交流社区
标题:
关于单例设计模式
[打印本页]
作者:
natalie
时间:
2013-8-7 09:27
标题:
关于单例设计模式
本帖最后由 杨兴庭 于 2013-8-7 17:55 编辑
单例设计模式有两种方式有懒汉式和饿汉式。两者的区别就是实例化的顺序不同。都能实现单例设计的功能。开发中用饿汉式,那懒汉式既然又不安全又麻烦。万事万物都有其存在的必要于意义。那懒汉式存在的意义与价值在哪里啊,请教一下各位。谢谢
作者:
张智文
时间:
2013-8-7 09:39
1,懒汉式:调用一次getInstance()就相当于执一次new,并返回实例。
return new Singleton();
如果你很懒,你只是突然想用(吃包子),让它新做一个实例(包子)。
2.饿汉式:这个实例一直都在那里,拿来就可以用了。
public Singleton getInstance(){return singletion;}
如果你很饿,你一要时时准备这个实例(包子),因为我随时可能要用到(吃包子)。
总结:
明显的,做一次包子花的时间比较拿包子的时间长。
这个可能和性能有关系,才决定你要用哪一种。
人人很饿,如果人人都跟老板讲,我要new一个新的。效率就不好了。
以前别人给讲的包子理论~很形象哈哈
作者:
黑马龙子
时间:
2013-8-7 15:08
懒汉式没有加私有的构造函数,从资源利用效率角度来讲从实现方式来讲比饿汉式稍高些,它是延时加载,是在需要的时候才创建对象,如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的;单例类在实例化时,必须处理好在多个线程同时首次引用此类时的访问限制问题,特别是当单例类作为资源控制器,在实例化时必然涉及资源初始化,而资源初始化很有可能耗费时间。这意味着出现多线程同时首次引用此类的机率变得较大。
而饿汉式是线程安全的,无需关注多线程问题、写法简单明了、能用则用,在虚拟机启动的时候就会创建,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变。
呵呵......我是这样理解的!
作者:
toShareBeauty
时间:
2013-8-7 16:43
本帖最后由 toShareBeauty 于 2013-8-7 16:44 编辑
懒汉式和饿汉式 单例设计模式的区别,主要是在创建实例的时间,饿汉式是在该类被类加载器加载的时候就会创建该类的实例,懒汉式则是在第一次调用 getInstance 的时候才会创建该类的实例,第二次以及后面调用只会返回以前创建的实例。这样,可以让栈内存的使用更加优化,比如你在大学读书大二以后就需要笔记本电脑,饿汉式是你一上大学就买了一个笔记本电脑,懒汉式是你大二需要的时候才买笔记本电脑。
如果类加载你不太清楚,到后面高新的时候你就会懂了。
懒汉式还有一个内部类形式:
public class Singleton_InnerClass {
private static class SingletonHolder {
// 静态初始化器,由JVM来保证线程安全
private static Singleton_InnerClass instance = new Singleton_InnerClass();
}
// 私有化构造方法
private Singleton_InnerClass() {
}
public static Singleton_InnerClass getInstance() {
return SingletonHolder.instance;
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2