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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 唐巍 黑马帝   /  2012-2-24 01:54  /  2392 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 唐巍 于 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;
        }
}

评分

参与人数 1技术分 +1 收起 理由
荣凯旋 + 1

查看全部评分

8 个回复

倒序浏览
饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变
懒汉式如果在创建实例对象时不加上synchronized则会导致线程安全问题
所以一般用饿汉式。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
class Single
{
        private static Single s=null;
        private Single(){}
        public static Single getInstance()
        {
                if(s==null)
                  
s=new Single();
                return s;
        }
}
回复 使用道具 举报
按错了TAB误发
不是故意的
回复 使用道具 举报
饿汉式:在类被加载到内存时,就存在这个static的对象的实例了。
惰汉式:是一种延迟加载,当我们需要这个单例的实例时,才去创建这个实例。
回复 使用道具 举报
二者只在创建对象的时候有区别,饿汉式是Single s=new Single();类加载时直接创建对象分配空间;
懒汉式是
Single s=null;
if(s==null)
s=new Single();
类加载时穿件对象但是不分配堆空间,指向为null,在对象被调用的时候再new,分配堆空间。

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

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

这样说明白吗?
            

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
如果要用懒汉式必须考虑线程安全性问题必须同步如下代码
  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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

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

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
沈样 黑马帝 2012-2-25 08:44:01
9#
这个还要安全的问题吧我觉得,基础视频有讲的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马