单例模式-梳理

本文详细探讨了单例模式的几种实现方式,包括饿汉式、懒汉式及内部类实现,分析了各自的优缺点,并通过代码示例展示了如何防止反射和序列化破坏单例模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
 * @author XQQ
 * @create 2019-03-11 17:10
 * @desc 饿汉式单例
 * 1、缺点浪费内存空间
 **/
public class EhsSingle {

    private EhsSingle (){}

    private final static EhsSingle e=new EhsSingle();

    public static EhsSingle GetInstance(){
        return e;
    }
}
//--------------------------------------
/**
 * @author XQQ
 * @create 2019-03-11 17:12
 * @desc 懒汉式单例
 *  1、缺点性能问题。阻塞
 **/
public class LazySimple {

    private static LazySimple  l=null;
    private LazySimple (){}

    public synchronized static LazySimple get(){

        if(l==null){
            l=new LazySimple();
        }
        return l;
    }

}


/**
 * @author XQQ
 * @create 2019-03-11 17:32
 * @desc 1/性能和内存都优化了
 **/
public class LazyS {
    
    private static LazySimple  l=null;

    private LazyS (){}
    public  static LazySimple get(){

        if(l==null){
            synchronized (LazyS.class) {
                if(l==null) {
                    l = new LazySimple();
                }
            }
        }
        return l;
    }
}

/**
 * @author XQQ
 * @create 2019-03-11 17:44
 * @desc 类部类实现单例
 * 但是还是有问题。存在。同反射也是可以实例化多个
 **/
public class LazySn {


    private LazySn (){}
    //懒汉式单例,加final,方法不能重写
    public static final LazySn laz(){
        return aa.s;
    }

    //饿汉式单例
    private static class aa{
        public static final LazySn s=new LazySn();
    }


}




/**
 * @author XQQ
 * @create 2019-03-11 17:56
 * @desc  这样破坏了单例
 **/
public class LazyProxy {


    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {

        Constructor<LazySn> declaredConstructor = LazySn.class.getDeclaredConstructor(null);
        declaredConstructor.setAccessible(true);
        LazySn lazySn = declaredConstructor.newInstance();
        System.out.println(lazySn);
        LazySn lazySn2 = declaredConstructor.newInstance();
        System.out.println(lazySn2);


    }

}
-----------------两个实例
top.xiequanquan.demo.basic.LazySn@1540e19d
top.xiequanquan.demo.basic.LazySn@677327b6



当然以上的都不能保证单例。比如反射,序列化 等可以破解


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值