1.饿汉式:单例模式在类装载时就实例化
优点:a.线程安全,在类加载时就创建好静态对象,调用速度快
确定: 资源利用率不高,可能永远也无法执行到getInstance方法,但是多次通过别的静态方法加载该类(Class.forName(Singleton1.Class)),但每次仍会创建实例
public class Singleton1{ private Singleton1{
}
Singleton1 instance=new Singleton1();
public static Singleton1 getInstance{
return instance;
}
}
2.饱汉式:单例实例在第一次被使用时构建,延迟初始化
优点:避免了资源耗费
缺点:线程不安全,在多线程中可能出现多个Sinleton2实例
public class Singleton2{ private Singleton2{
}
Singleton2 instance=null;
public static Singleton2 getInstance{
if(instance==null){
return new Singleton2();
}
}
}
若要改进,首先想到加锁:
优点:资源利用率高,不执行getInstance就不会实例化,可以执行该类的其他静态方法
缺点:多线程增加了不必要的开销 public class Singleton3{ private Singleton3{
}
Singleton3 instance=null;
public static synchronized Singleton3 getInstance{
if(instance==null){
instance= new Singleton3();
}
return instance;
}
}
4.双重加锁机制
优点:资源利用率高,不执行getInstance就不会实例化,可以执行该类的其他静态方法 缺点:第一次加载不够快,
public class Singleton4{ private Singleton4{
}
Singleton3 instance=null;
public static Singleton4 getInstance{
if(instance==null){
synchronized(Singleton4.class){
if(instance==null){
instance = new Singleton4();
}
}
}
return instance;
}
}
5.静态内部类
优点:资源利用率高,不执行getInstance就不会实例化,可以执行该类的其他静态方法 缺点:第一次加载时响应不快
public class Singleton5{ private Singleton{
}
private static class SingletonHandler{
static Singleton5 instance=new Singleton5();
}
private Singleton5 getInstance{
return SingletonHandler.instance;
}
}
总结:一般采用饿汉式,若资源有限,可采用静态内部类。