单例模式的设计

本文详细探讨了Java中的单例模式,包括其设计原则、实现方式和应用场景。通过实例解析,展示了如何创建线程安全且高效的单例,以及单例模式在软件设计中的重要性。

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

单例模式的设计:

//懒汉式单例模式,在第一次调用时实例化
public class LazyHolder {

    public LazyHolder(){}

    private static LazyHolder lazyHolder=null;

    //方式一
    //非线程安全,加上同步锁,但是每次都要同步,会影响性能
    public static  synchronized  LazyHolder getLazyHolder(){
        if (lazyHolder ==null){
            lazyHolder=new LazyHolder();
        }
        return lazyHolder;
    }

    //方式二
    //做了两次null检查,确保了只有第一次调用单例的时候才会做同步,这样也是线程安全的,同时避免了每次都同步的性能损耗
    public static  LazyHolder getLazyHolder2(){
        if (lazyHolder ==null){
            synchronized (LazyHolder.class){
                if (lazyHolder==null){
                    lazyHolder=new LazyHolder();
                }
            }
        }
        return lazyHolder;
    }
}

//方式三
//实现了线程安全,同事避免了同步带来的性能影响
class LazyHolder2{

    private static class Singleton{
        private static final LazyHolder2 INSTANT = new LazyHolder2();
    }

    private LazyHolder2(){
    }

    public static final LazyHolder2 getLazy(){
        return Singleton.INSTANT;
    }

}

//饿汉式单例
//饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,线程安全
class  Singleton{
    private Singleton(){}

    private static final Singleton singleton = new Singleton();
    //静态工厂方法
    public static Singleton getInstance(){
        return singleton;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值