第一种形式: 定义一个类,它的构造函数为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; }
} 为什么第二种形式比第一种形式效率高,在第一种形式中,不是也只产生了一个对象嘛?
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; }
} 为什么第二种形式比第一种形式效率高,在第一种形式中,不是也只产生了一个对象嘛?
THS,笔误
第一方法:存在这样的实例,返回的对象,就是第一次创建的这个对象,是唯一的。
第二种方法,只有在第一次调用getInstance()方法的时候new一个对象。一直认为第一种方法效率更高一点,因为同样new一个对象,它在调用getInstance()方法的时候不用做一次判断。
等待高人批评指正。
* @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;
}
}