单例模式

核心思想:构造器私有化。

饿汉式:

//饿汉式单例模式
public class Hungry {
    private Hungry(){}
    private final static Hungry hungry=new Hungry();
    public static Hungry getHungry(){
        return hungry;
    }
}
缺点:

消耗内存过高
在反射下是不安全

懒汉式(线程不安全)

public class LazMan {
    private LazMan(){}
    
    public static LazMan lazman;
    
    public static LazMan lazMan(){
        if (lazman==null){
            lazman=new LazMan();
        }
        return lazman;
    }
}
缺点:

在多线程下不安全
在反射下不安全

懒汉式(线程安全)

//懒汉式单例
public class LazMan {
    private LazMan(){}

    public volatile static LazMan lazman;

    public static LazMan lazMan(){
        if (lazman==null){
            synchronized (LazMan.class){
                if (lazman==null){
                    lazman=new LazMan();
                }
            }
        }
        return lazman;
    }
}
缺点:

在反射下不安全

内部类单例

//静态内部类单例
public class Holder {
    
    private Holder(){}
    
    public static Holder getHolder(){
        return InnerClass.holder;
    }
    
    private static class InnerClass{
        private final static Holder holder=new Holder();
    }
}
缺点:

在反射下不安全

为什么反射可以破解:

使用反射可以直接修改内部的权限
直接可以把构造器公开

解决:

使用枚举,因为反射不能破坏枚举

public enum EnumSingle {
    INSTANCE;
    public EnumSingle getInstance(){
        return INSTANCE;
    }
}

你可能感兴趣的:(单例模式)