黑马程序员技术交流社区

标题: 关于单例设计模式 [打印本页]

作者: 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 的时候才会创建该类的实例,第二次以及后面调用只会返回以前创建的实例。这样,可以让栈内存的使用更加优化,比如你在大学读书大二以后就需要笔记本电脑,饿汉式是你一上大学就买了一个笔记本电脑,懒汉式是你大二需要的时候才买笔记本电脑。
如果类加载你不太清楚,到后面高新的时候你就会懂了。
懒汉式还有一个内部类形式:
  1. public class Singleton_InnerClass {

  2.         private static class SingletonHolder {
  3.                 // 静态初始化器,由JVM来保证线程安全
  4.                 private static Singleton_InnerClass instance = new Singleton_InnerClass();
  5.         }

  6.         // 私有化构造方法
  7.         private Singleton_InnerClass() {

  8.         }

  9.         public static Singleton_InnerClass getInstance() {
  10.                 return SingletonHolder.instance;
  11.         }
  12. }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2