2009年8月6日星期四

[转]单例的懒汉模式和饿汉模式

    饿汉式: 
        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; 
            public static synchronized synchronized getInstance(){ 
                if(singleton==null){ 
                    singleton = new Singleton(); 
                } 
                return singleton; 
            } 
      } 

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

Spring in action 2nd 看到如下的一个例子 
这样确保线程安全的同时, 比上面创建静态实例域的办法还有一个好处就是: 
SingletonHolder中可以使用静态方法替换静态域, 实现比较复杂的逻辑, 而不仅仅是new Singleton()这样简单地调用构造方法.


public class Singleton { private Singleton() {} private static class SingletonHolder { static Singleton instance = new Singleton(); } public static Singleton getInstance() { return SingletonHolder.instance; } }

没有评论: