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

© hadexs 中级黑马   /  2013-6-23 12:18  /  1288 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Super_Class 于 2013-6-24 18:39 编辑

懒汉式与饿汉式有什么区别啊?开发时大多数情况用什么模式?

评分

参与人数 1技术分 +1 收起 理由
Super_Class + 1

查看全部评分

4 个回复

倒序浏览
饿汉式是直接随着类的加载直接生成对象, 而懒汉式是调用一个类的类似getInstance方法的时候, 变判断是否已经有这个对象了, 如果有直接用, 如果没有就生成一个.


建议使用懒汉式,
懒汉式的缺点: 延迟加载, 所以线程不安全, 使用synchronized解决之后效率稍降低.

评分

参与人数 1技术分 +1 收起 理由
Super_Class + 1

查看全部评分

回复 使用道具 举报
饿汉式:先初始化对象,类一进内存,就已经创建好对象;
懒汉式:对象是方法被调用时,才初始化,也叫做对象的延时加载。
记录原则:定义单例,建议使用饿汉式。
懒汉式存在缺点,线程不安全,使用synchronized,效率会降低,使用双重判断,代码繁琐。

饿汉式:

  1. class Single {
  2.         private static Single s = new Single();

  3.         private Single() {
  4.         }

  5.         public static Single getInstance() {
  6.                 return s;
  7.         }
  8. }
复制代码
懒汉式:
class SingleTest {
        private static SingleTest s = null;

        private SingleTest() {
        }

        public static SingleTest getInstance() {
                if (s == null) {
                        synchronized (SingleTest.class) {
                                if (s == null)
                                        s = new SingleTest();
                        }
                }
                return s;
        }
}

评分

参与人数 1技术分 +1 收起 理由
刘凯 + 1 赞一个!

查看全部评分

回复 使用道具 举报
饿汉式是先定义对象,懒汉式是后加载对象。开发时一般用饿汉式。因为懒汉式在多线程中会引发安全问题。
回复 使用道具 举报
单例设计模式:
大家都知道单例有“懒汉式”和“饿汉式”.
     其实张老师提到过单例还有一种实现方式,那就是“枚举”。
因为枚举也是不能用 new 来创建对象的,所以当枚举中只定义了一个对象值时,就成了特殊的单例。

  1. 单例写法两种:
  2.         (1)饿汉式 开发用这种方式。
  3.        先初始化对象,类一进内存,就已经创建好对象;
  4.         class Student
  5.         {
  6.                 private Student(){}

  7.                 private static Student s = new Student();

  8.                 public static Student getInstance()
  9.                 {
  10.                         return s;
  11.                 }
  12.         }
  13.         (2)懒汉式 面试写这种方式。
  14.        对象是方法被调用时,才初始化
  15.   懒汉式就是延迟加载,但一般的形式会出现线程安全问题.
  16.   所以出现了以下的改良版:通过加锁保证线程安全,双重判断提高效率

  17.         class Teacher
  18.         {
  19.                 private Teacher(){}

  20.                 private static Teacher t;

  21.                 public static Teacher getInstance()
  22.                 {
  23.                         synchronized(Teacher.class)
  24.                        {
  25.                                 if(t==null)
  26.                                 {
  27.                                       t = new Teacher();
  28.                                 }
  29.             }
  30.                        
  31.                         return t;
  32.                 }
  33.         }

复制代码

评分

参与人数 1技术分 +1 收起 理由
Super_Class + 1

查看全部评分

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