饿汉式:
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则会导致对对象的访问不是线程安全的
推荐使用第一种
还有一种方式是静态内部类:如果对资源使用十分在意可考虑使用
public class S4 {
private S4() {
System.out.println("ok4");
}
private static class S4Holder {
static S4 instance = new S4();
}
public static S4 getInstance() {
return S4Holder.instance;
}
}
最新的方式生成单例,使用jdk1.5的新特性,并能防止通过反射的方式生成多个对象
/**
* 枚举实现的Singleton
*
*
*/
enum TestSingleton {
INSTANCE;
public static TestSingleton getInstance() {
return INSTANCE;
}
}