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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郭振 中级黑马   /  2012-5-7 08:46  /  1409 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

关于单例设计的帖子我看了不少,但是我还是有疑问,既然懒汉式比饿汉式多加了判断语句,还出现线程不同步的问题,为什么还有存在的意义?设计模式不就是个看上去简单,但是又非常不简单的问题。我很不理解?

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

3 个回复

倒序浏览
我个人认为是为了节约内存。其实这些设计者们的思想是很严谨的。还记得写迭代器的时的循环while(it.hasNext())吗?java源码中使用的是for循环for(Iterator it = al.iterator(); it.hasNext();)。我们写代码时使用while循环是为了增强阅读性,而源码使用for循环是为了节约内存。而懒汉式单例设计模式的特点就是延迟创建对象,相对饿汉式要节约内存,在对内存占用要求较高的程序中有用武之地。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 隋营营 于 2012-5-7 09:27 编辑

饿汉式:
public class Treasure {
    private static Treasure treasure = new Treasure();

    private Treasure() {
    }

    public Treasure getInstance() {
        return treasure ;
    }
}

懒汉 式 :

public class Treasure {
    private static Treasure treasure = null;

    private Treasure() {
    }

    public static synchronized getInstance() {
        if (treasure == null) {
            treasure = new Treasure();
        }
        return treasure;
    }
}

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

在一般情况下推荐使用第一种
但是懒汉式也有存在的意义:当多线程同时访问时,会在牺牲效率的前提下保证安全!

回复 使用道具 举报
  1. class Single{
  2.         public static Single s=null;
  3.         private Single(){
  4.                
  5.         }
  6.         public static Single getSingle(){
  7.                 if (s==null){
  8.                         synchronized(Single.class){
  9.                                 if (s==null)
  10.                                         s=new Single();
  11.                         }
  12.                 }
  13.                 return s;
  14.         }
  15. }
复制代码
最有效率的单例设计模式的懒汉式,双重判断
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马