double-check locking:
第一种方式:public class Singleton {
    private static Singleton instance = null;
    private Singleton(){}
    public static Singleton getInstance() {
        if (instance == null){
            synchronized(Singleton.class){
                if(instance == null) {
                     instance = new Singleton();
                }
            }
        }
        return instance;
    }
}
第二种方式:public class Singleton {
    private static Singleton instance = null;
    private static final Object object = new Object();
    private Singleton(){}
    public static Singleton getInstance() {
        if (instance == null){
            synchronized(object){
                if(instance == null) {
                     instance = new Singleton();
                }
            }
        }
        return instance;
    }
}
三:另外的实现方式:2>下面的这种方式呢?public class Singleton { 
    private static Singleton instance = new Singleton();     private Singleton() { 
        // .... 
    }     public static Singleton getInstance() { 
        return instance; 
    }     // 其它实作 
}
3>另外这种方式?public class Singleton {
    private static class SingletonHolder {
        static final Singleton instance = new Singleton();
    }
    public static Singleton getInstance() {
        return SingletonHolder.instance;
    }
}
问题1:1>请问第一种方式和第二种方式有什么区别?
  性能方面呢?2>另外的方式有什么区别?
  性能?安全性?

解决方案 »

  1.   

    前2种有区别么?都是延迟初始化,用双重锁检查。
    一个object 一个Singleton.class。 jdk1.5以前别用这种模式,会出问题的。就是1.5以后也要用volatile fix一下(private static volatile Singleton instance = null)后面2种有区别么?只是写法不一样罢了,都是预先初始化。这种方式没有问题,哪都能用。
      

  2.   

    额。后面说法有点错误。最后一种也是延时初始化。 当Singleton.getInstance 调用时或访问SingletonHolder.instance时,static class SingletonHolder才真正把instance初始化出来。
      

  3.   

    发现一个帖子被CSDN拆成两个了
    http://topic.csdn.net/u/20120925/11/cc4584c5-f4f2-4346-880f-fb8d2c2bc5d9.html?seed=759840063&r=79753401#r_79753401
    晕死