黑马程序员技术交流社区

标题: 关于单例模式的懒汉式与饿汉式 [打印本页]

作者: 刘志祥    时间: 2011-12-6 21:40
标题: 关于单例模式的懒汉式与饿汉式
本帖最后由 刘志祥 于 2011-12-7 14:08 编辑

这两个模式究竟该怎么理解,请高手赐教!最好能形象点。。。谢谢!
作者: fly51888    时间: 2011-12-6 21:46
本帖最后由 fly51888 于 2011-12-6 21:49 编辑

饿汉式:
  public class  App{
  private static App app = new App();
  private App(){}
  public App  getInstance(){return app;}
  }  

  懒汉式:
  public class App{
  private static App  app = null;
  public static synchronized synchronized getInstance(){
  if(app ==null){
  app = new App();
  }
  return app ;
  }
  }  

  比较:
  饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变
  懒汉式如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的
  推荐使用第一种
作者: 唐秀启    时间: 2011-12-6 21:51
本帖最后由 benbenqi 于 2011-12-6 22:36 编辑

懒汉式:对象是方法被调用时,才初始化,也叫做对象的延时加载
  1. class Single
  2. {
  3.         private static Single s = null;
  4.         private Single(){}
  5.         public static Single getInstance        {
  6.                
  7.                 if (s==null)
  8.                         s = new Single();
  9.                 return s;
  10.         }
  11. }
复制代码
Single类进内存,对象还没有存在,只有调用getInstance方法时,才创建对象

饿汉式:不管你对象是否调用,先初始化对象
  1. class Single
  2. {
  3.         private Single(){}
  4.         private static Single s = new Single();
  5.         public static Single getInstance()
  6.         {
  7.                 return s;
  8.         }
  9. }
复制代码
Single类一进内存,就已经创建好了对象

一般采用饿汉式,懒汉式要解决同步问题,需要加锁

可以这么理解:懒汉式:这个对象比较懒,特懒散,只要你不用它,它就不动。一直等到调用该对象所在方法时,才去创建对象
饿汉式:这个对象饿得要死,简直是一个饿死鬼,只要该对象所在类一加载到内存,对象就创建好了,恐怕自己被饿死。
作者: 武超    时间: 2011-12-6 22:36
这两种都是单例设计模式
懒汉式也叫做对象的延时加载,方法被调用时,对象才初始化。
饿汉式不管你对象是否调用,都要先对对象进行初始化。
作者: 应国炎    时间: 2011-12-7 13:57
解释:
饿汉式:不管用不用,都开辟内存空间   优点:避免死锁  缺点:浪费内存空间
懒汉式:用的时候才开辟内存空间     优点:节省内存空间 缺点:可能会死锁

1 其实两个方法都可以使用
2 如果内存够大,推荐用饿汉式
3 两者使用内存方式不用,涉及到了线程的问题. 因为懒汉式有可能会引起死锁,所以一般都推荐用饿汉式





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