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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 马晓平 中级黑马   /  2013-10-21 23:47  /  2050 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

懒汉式和饿汉式的区别是什么?

5 个回复

倒序浏览
饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变.懒汉式则是在你使用的时候才创建对象,如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的.建议使用使用饿汉式
回复 使用道具 举报
这是一个单例模式俩个名称:
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;
}
}

一般编程用饿汉式  
回复 使用道具 举报
赖汉式的特点是对实例的延迟加载,但是赖汉式延迟加载时,如果多线程访问,会出现安全问题, 为了避免安全问题, 可以加同步在解决安全问题,但是加同步之后, 由于每个都要判断锁, 所有效率低。如果效率提高,就要使用双重判断语句,
代码如下
  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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1 很给力!

查看全部评分

回复 使用道具 举报
最简单的区别就是创建对象的时机不同。饿汉式是一加载就创建对象,懒汉式是在调用方法时才去创建对象。
回复 使用道具 举报
都是单例设计模式设计,要说不同的话,饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变,懒汉式如果在创建实例对象时不加上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(...) {
        ...
    }
}

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1 很给力!

查看全部评分

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