第一种形式: 定义一个类,它的构造函数为private的,它有一个static的private的该类变量,在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。 
public class Singleton { 
private Singleton(){} 
   
     private Singleton() {}
   //注意这是private 只供内部调用 
   private static Singleton instance = new Singleton(); 
   //这里提供了一个供外部访问本class的静态方法,可以直接访问   
   public static Singleton getInstance() { 
     return instance;    
   } 

第二种形式: 
public class Singleton { 
   private Singleton() {}
  private static Singleton instance = null; 
  public static synchronized Singleton getInstance() { 
  //这个方法比上面有所改进,不用每次都进行生成对象,只是第一次     
  //使用时生成实例,提高了效率! 
  if (instance==null) 
    instance=new Singleton(); 
return instance;   } 
} 为什么第二种形式比第一种形式效率高,在第一种形式中,不是也只产生了一个对象嘛?

解决方案 »

  1.   


    THS,笔误
    第一方法:存在这样的实例,返回的对象,就是第一次创建的这个对象,是唯一的。
      

  2.   

    第一种方法,只有在第一次加载类的时候new一个对象。
    第二种方法,只有在第一次调用getInstance()方法的时候new一个对象。一直认为第一种方法效率更高一点,因为同样new一个对象,它在调用getInstance()方法的时候不用做一次判断。
    等待高人批评指正。
      

  3.   

    第一种是在第一次类加载的时候创建实例,而第二种则是在类加载时不产生实例,什么时候用什么时候进行判断产生实例,每一次获取实例都要进行判断,所以我认为第一种效率会比第二种效率高,你可以试一下,你知道第二种叫什么名吗,懒汉式我把测试贴出来,你可以试一下public class Test { /**
     * @param args
     */
    public static void main(String[] args) {
    long start = System.currentTimeMillis();
    for(int i=0;i<10000000;i++) {
    // Singleton sl = Singleton.getInstance();//切换注释就行
    Singleton2 sl = Singleton2.getInstance();
    }
    long end = System.currentTimeMillis();
    System.out.println(end-start);
    }}class Singleton {
    private static Singleton sl = new Singleton();

    public static Singleton getInstance() {
    return sl;
    }
    }class Singleton2 {
    private static Singleton2 sl = null;

    public static Singleton2 getInstance() {
    if(sl == null) {
    sl = new Singleton2();
    }
    return sl;
    }
    }