黑马程序员技术交流社区

标题: 单例设计模式问题 [打印本页]

作者: 唐巍    时间: 2012-2-24 01:54
标题: 单例设计模式问题
本帖最后由 唐巍 于 2012-2-24 01:54 编辑

单例设计模式中的饿汉式和懒汉式在加载时有什么不同?为什么在java开发中一般使用饿汉式,不用懒汉式?

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

懒汉式:
class Single
{
        private static Single s=null;
        private Single(){}
        public static Single getInstance()
        {
                if(s==null)
                    s=new Single();
                return s;
        }
}
作者: 王睿    时间: 2012-2-24 02:01
饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变
懒汉式如果在创建实例对象时不加上synchronized则会导致线程安全问题
所以一般用饿汉式。
作者: tanlei200620    时间: 2012-2-24 02:10
class Single
{
        private static Single s=null;
        private Single(){}
        public static Single getInstance()
        {
                if(s==null)
                  
s=new Single();
                return s;
        }
}
作者: tanlei200620    时间: 2012-2-24 02:12
按错了TAB误发
不是故意的
作者: 【专】【属】    时间: 2012-2-24 09:48
饿汉式:在类被加载到内存时,就存在这个static的对象的实例了。
惰汉式:是一种延迟加载,当我们需要这个单例的实例时,才去创建这个实例。
作者: 孙汇川    时间: 2012-2-24 10:24
二者只在创建对象的时候有区别,饿汉式是Single s=new Single();类加载时直接创建对象分配空间;
懒汉式是
Single s=null;
if(s==null)
s=new Single();
类加载时穿件对象但是不分配堆空间,指向为null,在对象被调用的时候再new,分配堆空间。

饿汉式一步完成,不会出现不安全因素;
而懒汉式分两步,可能多个线程在执行String s = null;后sleep();然后醒后创建多个对象,就违反了单例模式的规则,不安全。

开发中用饿汉式不用懒汉式也是出于安全考虑,看似懒汉式能更有效的利用堆栈空间,但是它不安全,若
用加锁来实现它的安全性又降低了效率,所以综合考虑还是用饿汉式。效率高,写代码方便,稍微占用一
些堆栈空间也是可以的。

这样说明白吗?
            
作者: 马胜平    时间: 2012-2-24 11:13
如果要用懒汉式必须考虑线程安全性问题必须同步如下代码
  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.                                        
  13.                                         s = new Single();
  14.                         }
  15.                 }
  16.                 return s;
  17.         }
  18. }
复制代码

作者: 陈伟    时间: 2012-2-24 11:29
单例模式的两种设计模式:懒汉式和饿汉式,
懒汉式在类一加载就创建一个对象。
饿汉式是在你需要创建对象时才会创建,
而且还加了限制条件,
if(s==null)
                     s=new Single();
所以一般设计程序都选用饿汉式,可以节省内存

作者: 沈样    时间: 2012-2-25 08:44
这个还要安全的问题吧我觉得,基础视频有讲的




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