单例模式

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

饿汉式:

//饿汉式单例模式
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;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容