黑马程序员技术交流社区

标题: 懒汉式和饿汉式的区别是什么 [打印本页]

作者: 马晓平    时间: 2013-10-21 23:47
标题: 懒汉式和饿汉式的区别是什么
懒汉式和饿汉式的区别是什么?
作者: 张运    时间: 2013-10-22 00:01
饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变.懒汉式则是在你使用的时候才创建对象,如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的.建议使用使用饿汉式
作者: 回天之力    时间: 2013-10-22 00:18
这是一个单例模式俩个名称:
1,饿汉式:
class Single
{
  private static finally Single s=new Single();
  private Single(){}
  public static Single getInstence()
{
      return s;
}
}
2,懒汉式
class Single
{
  private static  Single s=null;
  private Single(){}
  public static Single getInstence()
{
  if(s==null)
    s=new Single();
      return s;
}
}

一般编程用饿汉式  
作者: Simple_love    时间: 2013-10-22 01:56
赖汉式的特点是对实例的延迟加载,但是赖汉式延迟加载时,如果多线程访问,会出现安全问题, 为了避免安全问题, 可以加同步在解决安全问题,但是加同步之后, 由于每个都要判断锁, 所有效率低。如果效率提高,就要使用双重判断语句,
代码如下
  1. class Single
  2. {
  3.         private static Single s = null;
  4.         private Single(){}


  5.         public static  Single getInstance()
  6.         {
  7.                 if(s==null)
  8.                 {
  9.                         synchronized(Single.class)
  10.                         {
  11.                                 if(s==null)
  12.                                         s = new Single();
  13.                         }
  14.                 }
  15.                 return s;
  16.         }
  17. }
复制代码

作者: 蓝雨星空    时间: 2013-10-22 07:00
最简单的区别就是创建对象的时机不同。饿汉式是一加载就创建对象,懒汉式是在调用方法时才去创建对象。
作者: 朱艳    时间: 2013-10-22 07:47
都是单例设计模式设计,要说不同的话,饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变,懒汉式如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的。推荐使用第一种。

但是也有大神说存在这样的问题:

饿汉式在声明实例变量时不加final关键字,并且非正常使用时可能存在问题:

第一个人使用时:

  Singleton s = Singleton.getInstance();
  s.executeMethod();
  s = null; // 非正常使用


当另一个人使用时:
Java code
?
1
2
  Singleton s = Singleton.getInstance();
  s.executeMethod(); // throw a NullPointException



懒汉式则不存在此问题:

public class Singleton {
    private static Singleton instance = new Singleton();
    private static Object synObject = new Object();
    private Singleton(){}
    public static Singleton getInstance() {
        if (instance!=null) {
            return instance;
        }
        synchronized(synObject) {
            if (instance==null) {
                instance = new Singleton();
            }
        }
        return instance;
    }
    public void executeMethod(...) {
        ...
    }
}




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