黑马程序员技术交流社区

标题: 懒汉式和饿汉式汉语谁能讲一下呀,有点蒙 [打印本页]

作者: 小洋人最happy    时间: 2012-11-19 22:04
标题: 懒汉式和饿汉式汉语谁能讲一下呀,有点蒙
本帖最后由 小洋人最happy 于 2012-11-19 23:03 编辑

class  SingleDemo2
{
private static Single s = null;
private Single(){}
public static Single getInstance()
{
  if(s==null)
   s = new Single();
  return s;
}
}


class Single
{
private single(){}
private static single s = new Single();
public static Single getInstance()
{
  return s;
}
}



作者: 金鑫    时间: 2012-11-19 22:17
本帖最后由 金鑫 于 2012-11-19 22:19 编辑

第一个是懒汉式:
//在类刚加载进来时,对象的指向为空,没有创建任何对象,当调用getInstance()方法时会进行判断
private static Single s = null;
if(s==null)//如果对象为空
   s = new Single();//那么才开始创建对象
  return s;//然后将对象返回


第二个是饿汉式:
private static single s = new Single();//当类加载进来之后,就在第一时间创建了对象,并在getInstance()方法中将对象返回
public static Single getInstance()
{
  return s;
}


其中饿汉式比懒汉式的安全性高,因为在多线程中,懒汉式可能会出现不能保证对象唯一的情况。
作者: 杜正冬    时间: 2012-11-19 22:25
我看到了饿。。。。该吃饭了
作者: 刘腾    时间: 2012-11-19 22:47
本帖最后由 刘腾 于 2012-11-19 22:50 编辑

懒汉模式可以这样理解:该单例类非常懒,只有在自己需要对象的时候才会判断是否已有对象,如果没有就创建一个对象,然后返回,如果已有对象,立即返回。
饿汉式单例:该单例类非常饿,迫切需要吃东西,所以在类加载的时候立即创建对象。

我们对比一下这两种模式的优缺点:
懒汉模式:运行时获得对象的速度比较慢,但是类的加载比较快。他在整个的应用生命周期中,只有一部分时间在占用资源。
饿汉模式:运行时加载类的速度比较慢,但是获取对象的速度比较快。它从加载到应用结束一直在占用资源。

从用户体验的角度来说,我们应该首选饿汉模式。我们愿意等待某个程序花较长的时间初始化,却不喜欢在程序运行时等待太久,给人一种反应迟钝的感觉,所以对于有重量级对象参与的单例模式, 我们推荐使用饿汉模式 。
//懒汉式,当多个线程访问时,不安全,返回的不是同一个对象
class  SingleDemo2
{
private static SingleDemo2 s ;
private SingleDemo2(){}//看这里,lz你帖子的写法不对,构造函数与类名名称一致
public static SingleDemo2 getInstance()
{
  if(s==null)
   s = new SingleDemo2();
  return s;
}
}
//饿汉式,线程安全,但是效率比较低
class Single
{
private single(){}
private static single s = new Single();
public static Single getInstance()
{
  return s;
}
}
//虽然是安全的,但是效率非常低,一个时候只有一个线程访问,同时返回一个对象
class  SingleDemo3
{
private static SingleDemo3 s ;
private SingleDemo3(){}
public static synchronized SingleDemo3 getInstance()
{
  if(s==null)
   s = new Single();
  return s;
}
}
//效率高,多线程

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



作者: 小洋人最happy    时间: 2012-11-19 22:53
刘腾 发表于 2012-11-19 22:47
懒汉模式可以这样理解:该单例类非常懒,只有在自己需要对象的时候才会判断是否已有对象,如果没有就创建一 ...

哦 好 非常感谢
作者: 余磊    时间: 2012-11-20 11:03
我也在这块有缺陷,谢谢各位啦!
作者: 杜正冬    时间: 2012-11-20 18:48
饿汉式:先初始化
   Single s=new Single();
        return s;
懒汉式:判断之后初始化
   single s=null;
     if(s==null)
        s=new Single();
     return s;
作者: jerry2627    时间: 2012-11-21 02:50
急着创建对象的就是饿汉式呀
class Single
{
private single(){}
private static single s = new Single();
public static Single getInstance()
{
  return s;
}
}
吃饱了就懒得动了,总是拖到最后才去创建就是懒汉式额
class  SingleDemo2
{
private static Single s = null;
private Single(){}
public static Single getInstance()
{
  if(s==null)
   s = new Single();
  return s;
}
}
个人的区分方式。。。




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