饿汉式单例是线程安全的,类加载的时候创建实例
懒汉式单例是线程不安全的,
双检锁懒汉单例需要加volatile关键词,防止指令重排导致获取实例未赋值。
private static volatile Singleton INSTANCE = null;
public static Singleton getInstance(){
if (INSTANCE==null){
synchronized(Singleton.class){
if (INSTANCE==null){
INSTANCE=new Singleton();
}
}
}
return INSTANCE;
}
内部静态类懒汉式
class Singleton {
private Singleton(){}
private static class Holder{
static Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance(){
retrun Holder.INSTANCE;
}
}
jdk中
Runtime类 饿汉式单例
System类 cons用双检锁单例
Collections类 Empty集合用内部类单例模式
重写readResolve()方法解决反序列化破坏单例创建
private Object readResolve(){
return Empty_NAVIGABLE_SET;
}