单例模式的的5种写法
一、饿汉式
public class Singleton{
private static Singleton instance=new Singleton;
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}
饿汉式,顾名思义,饥饿的人,迫不及待的要获取食物,即一开始类加载时就实例化了对象。
二、懒汉式
public class Singleton{
private static Singleton instance=null;
private Singleton(){}
public static Singleton getInstance(){
return instance=new Singleton();
}
}
懒汉式,即类加载时不实例化对象,当不得不用的时候才会实例化对象。
三、静态内部类
public class Singleton{
private Singleton(){}
public static Singleton getInstance(){
return SingletonGet.instance;
}
public static class SingletonGet{
private static final Singleton instance=new Singleton();
}
}
一开始加载Singleton类时并不会实例化Instance,当调用getInstance方法时虚拟机加载SingletonHolder 并实例化Instance,这样不仅能确保线程安全也能保证Singleton类的唯一性。
四、双重检查
public class Singleton{
private static volatile Singleton instance=null;
private Singleton(){};
public static Singleton getInstance(){
if(instance==null){
synchronized(){
if(instance==null){
instance=new Singleton();
}
}
}
return instance;
}
}
五、枚举
public enum Singleton{
INSTANCE;
public static Singleton getInstance(){
return INSTANCE;
}
}
枚举类天然的能同时满足多线程安全问题以及抵御序列化和反射对单例的破坏的问题。详情见:
https://www.jianshu.com/p/5647d1f598c7?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation