黑马程序员技术交流社区

标题: 关于单例设计的懒汉式 [打印本页]

作者: 郭振    时间: 2012-5-7 08:46
标题: 关于单例设计的懒汉式
关于单例设计的帖子我看了不少,但是我还是有疑问,既然懒汉式比饿汉式多加了判断语句,还出现线程不同步的问题,为什么还有存在的意义?设计模式不就是个看上去简单,但是又非常不简单的问题。我很不理解?
作者: 赵玮_Tom    时间: 2012-5-7 09:03
我个人认为是为了节约内存。其实这些设计者们的思想是很严谨的。还记得写迭代器的时的循环while(it.hasNext())吗?java源码中使用的是for循环for(Iterator it = al.iterator(); it.hasNext();)。我们写代码时使用while循环是为了增强阅读性,而源码使用for循环是为了节约内存。而懒汉式单例设计模式的特点就是延迟创建对象,相对饿汉式要节约内存,在对内存占用要求较高的程序中有用武之地。
作者: 隋营营    时间: 2012-5-7 09:22
本帖最后由 隋营营 于 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 则会导致对象的访问不是安全的

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


作者: 黄或俊    时间: 2012-5-7 13:14
  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. }
复制代码
最有效率的单例设计模式的懒汉式,双重判断




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