A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© natalie 初级黑马   /  2013-8-7 09:27  /  1610 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨兴庭 于 2013-8-7 17:55 编辑

单例设计模式有两种方式有懒汉式和饿汉式。两者的区别就是实例化的顺序不同。都能实现单例设计的功能。开发中用饿汉式,那懒汉式既然又不安全又麻烦。万事万物都有其存在的必要于意义。那懒汉式存在的意义与价值在哪里啊,请教一下各位。谢谢

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

3 个回复

倒序浏览
1,懒汉式:调用一次getInstance()就相当于执一次new,并返回实例。
return new Singleton();
如果你很懒,你只是突然想用(吃包子),让它新做一个实例(包子)。
2.饿汉式:这个实例一直都在那里,拿来就可以用了。
public Singleton getInstance(){return singletion;}
如果你很饿,你一要时时准备这个实例(包子),因为我随时可能要用到(吃包子)。
总结:
明显的,做一次包子花的时间比较拿包子的时间长。
这个可能和性能有关系,才决定你要用哪一种。
人人很饿,如果人人都跟老板讲,我要new一个新的。效率就不好了。
以前别人给讲的包子理论~很形象哈哈

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报 1 0
懒汉式没有加私有的构造函数,从资源利用效率角度来讲从实现方式来讲比饿汉式稍高些,它是延时加载,是在需要的时候才创建对象,如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的;单例类在实例化时,必须处理好在多个线程同时首次引用此类时的访问限制问题,特别是当单例类作为资源控制器,在实例化时必然涉及资源初始化,而资源初始化很有可能耗费时间。这意味着出现多线程同时首次引用此类的机率变得较大。
而饿汉式是线程安全的,无需关注多线程问题、写法简单明了、能用则用,在虚拟机启动的时候就会创建,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变。
呵呵......我是这样理解的!

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马