单例模式
关键点: 构造函数不对外开放,一般为private 通过一个静态方法或枚举对象返回单例类对象 确保单例类的对象只有一个,尤其在多线程模式下 确保单例类在反序列化时不会重新构造对象 必须保证线程安全 应用场景: 类 占用资源过多不宜创建多个实例,比如IO操作和数据库访问等
饿汉模式
在类首次加载到内存的时候就被初始化,不管是否使用都会初始化
public class Singleton{
private static final Singleton instance = new Singleton();
public static Singleton getInstance(){
return instance;
}
}
懒汉模式
首次使用时被初始化,每次调用都会进行同步,会消耗不必要的资源,造成不必要的同步开销
public class Singleton{
private static Singleton instance=null;
public static synchronized Singleton getInstance(){
if(instance==null){
instance=new Singleton();
}
return instance;
}
}
Double Check Lock(DCL)(推荐使用)
优点:资源利用率高,效率高 缺点:高并发的环境下小概率发生,第一次加载略慢,jdk1.5版本一下无法确保顺序
public class Singleton{
private static Singleton instance=null;
public ststic Singleton getInstance(){
if(instance==null){
synchronized ( Singleton .class){
if( instance==null )instance=new Singleton();
}
}
return instance;
}
}
静态内部类单例模式(推荐使用)
适用场景,构造函数无参数
public class Singleton{
public ststic Singleton getInstance(){ //第一次调用 Singleton类时不会加载,只有在 getInstance调用时才会初始化,线程安全,同时延迟了单例的实例化
return SingletonHolder.instance;
}
private static class SingletonHolder{//静态内部类
private static final Singleton instance = new Singleton();
}
}