黑马程序员技术交流社区

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

作者: 天天天    时间: 2012-11-30 19:09
标题: 单例设计模式的问题
单例设计模式的饿汉式和懒汉式有什么区别?用代码举例详细说明他们之间的区别表现在哪里?
作者: 李有    时间: 2012-11-30 19:16
饿汉式:
  public class Singleton{
      private static Singleton singleton = new Singleton ();
      private Singleton (){}
      public static Singleton getInstance(){
           return singletion;
      }
  }

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

  比较:
  饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变。
  懒汉式是延时加载,他是在需要的时候才创建对象,懒汉式如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的。
  推荐使用第一种  
作者: tfy    时间: 2012-12-1 00:10
们从辛辣面的BLOG里取它的例子来说明一下.
public class Singleton {
        private Singleton(){}
        private static Singleton instance = new Singleton();
        public static Singleton getInstance() {
        return instance;
        }
    }
这个就是一个很常用的饿汉式单例模式,非常容易理解,也就是说只要客户端调用方法:Singleton.getInstance() 就可以使用这个实例,而且是唯一实例.这种使用方式丝毫没有什么限制,任何客户端只要使用该语句就必然可以创建实例.从JAVA语言来说这种方式是最能表现单例模式的了.
同样我们说明懒汉式单例模式仍然使用辛辣面的一个例子:
public class Singleton {
        private Singleton(){}
        private static Singleton instance = null;
        public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
        }
    }
这也是一个单例模式,但是他和饿汉式有区别,它在创建时使用了线程标示synchronized ,而且在创建时进行了if (instance == null) {
            instance = new Singleton();
}
作者: 赵学刚    时间: 2012-12-2 00:21
public class Single {
private static Single s=null;
private Single (){
       
}
public  static Single getInstence (){
        if(s==null){
                synchronized(Single.class){
                        if(s==null){
                                 s=new Single();
                        }
                }
        }
        return s;
}
}
单例延迟加载的实例是懒汉式,但多线程时会产生异常,直接加锁又会多次判断,降低效率,这时可以使用双层判断来减少判断次数




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