设计模式----------单例模式----------万恶之首


       程序员总要有一颗进阶的心,最近几日看一下Glide,Retrofit 源码解析,巴拉巴拉,看的有些疲劳,有些也是云里雾里,发现对源码的剖析还得从设计模式学起,不然连个Builder模式不懂,就在看人家的代码,也会理解的不深刻,当然这篇文章只是我的总结,有问题或者更专业的解答,可以留言。

 

     文章将以关键字的形式进行,方便大家理解


 

单例关键词

  • 一个对象

  • 线程安全

  • 延迟加载(懒加载)

  • 效率

 

 


好了,单例的关键词就是这么多,面试时如果被问到就照着这四方面回答就行了,这四个点的概念就不多赘述了,大家自行百度吧。

 

饿汉式

public class Singleton {
    private Singleton() {}  //私有化构造器

    private static Singleton instance = new Singleton(); // 加载类时立刻生成一个对象

    public static Singleton getInstance() {      //调用实例
        return instance;
    }
}

这个就是一个饿汉式的单例,首先是一个对象,单例中都是使用私有化构造器来实现一个对象这个条件,如果要new一个对象,就会报错;

 

 

第二,三点感觉可以放在一起说,首先是一调用这个类,他就会立即生成一个实例,这也相对应的失去延迟加载,所以这个类就显的它非常的饿,就像你开自助餐的,你一说哪个菜烧好了,饿汉他不管有没有自己盘子里有没有菜,都要来再加,这就会引起不必要的浪费(程序上也是这样),然后是线程安全,就一句话,加载类时,天然线程是安全的。

 

第四点,效率,饿汉的调用效率是非常高的,简单即是高效。

 

 

懒汉式

public class Singleton {
    private Singleton() {}  //私有化构造器

    private static Singleton instance = null; //与饿汉相比只设为null,并不new

    public static synchronized Singleton getInstance() {      //调用实例(注意synchronized)
        if (instance == null) {                    //每次调用判断实例是否为空         
            instance = new Singleton();
        }
        return instance;
    }
}

第一点,一个对象就是通过私有化构造器实现

第二点是线程安全,这里就有点麻烦了,我们在getInstance方面前面加了一个synchronized,使它同步,试想一下,如果没有这个关键字,如果有10个线程同时在判断之后挂起,等最后一个线程判断完之后全部都创建对象,那这样我们得到的实例顺序是不是就被打乱了,结果不唯一,线程就不安全了。

第三点是延迟加载,通过一个判断来实现,举例子就是,还是自助餐,你新的菜品出来之后,他会先看看自己盘子里还有没有吃的,如果有他就不会来拿了。所以叫懒汉

第四点,因为同步锁的关系,每次执行getInstance都会执行同步检测,这对程序是灾难级的,所以懒加载是5种单例中效率最差的一种。

 

如果想要兼备高效和延迟呢?如何实现

  • 双重检测所实现

  • 静态内部类实现

  • 枚举实现

 

 

1.首先是双重检测所实现,https://www.cnblogs.com/xz816111/p/8470048.html

大家可以看看这位大神的,基本讲的比较详细,双重锁检测的问题也分析也比较到位,我就不献丑了

 

2.静态内部类实现


public class Singleton {
    private Singleton() {}  //私有化构造器

    private static class SingletonInstence {               //用静态内部类来创建实例
        private static final Singleton instance = new Singleton();
    }

    public static Singleton getInstance() {      //调用实例
        return SingletonInstence.instance;
    }
}

第一点我就不赘述了

 

第二点,首先和饿汉十分像,只是把创建单例工作放入静态内部类当中,所以它自然也是线程安全,理由也是和饿汉式一样。

第三点,延迟加载,为什么多了一个静态内部类就能实现懒加载呢。因为创建实例的动作是在内部类中执行的,只要你动用了getInstence时才会创建实例,就是这样实现了延迟加载。

第四点效率,这几乎是最好的单例模式,因为没有同步的关系,所以效率也十分客观,推荐使用

 

3.枚举实现

public enum  Singleton {
    INSTENCE;
}

好了,没有了,就这一句话,是不是都震惊到了

枚举元素本身就是一个单例

唯一遗憾的就是没用延迟加载功能,但是效率是十分高效的

 

效率总结

 

饿汉式 > 静态内部实现 > 枚举实现 > 双重检测锁 > 懒汉式

 

 

 

 

以下是对提供的参考资料的总结,按照要求结构化多个要点分条输出: 4G/5G无线网络优化与网规案例分析: NSA站点下终端掉4G问题:部分用户反馈NSA终端频繁掉4G,主要因终端主动发起SCGfail导致。分析显示,在信号较好的环境下,终端可能因节能、过热保护等原因主动释放连接。解决方案建议终端侧进行分析处理,尝试关闭节电开关等。 RSSI算法识别天馈遮挡:通过计算RSSI平均值及差值识别天馈遮挡,差值大于3dB则认定有遮挡。不同设备分组规则不同,如64T和32T。此方法可有效帮助现场人员识别因环境变化引起的网络问题。 5G 160M组网小区CA不生效:某5G站点开启100M+60M CA功能后,测试发现UE无法正常使用CA功能。问题原因在于CA频点集标识配置错误,修正后测试正常。 5G网络优化与策略: CCE映射方式优化:针对诺基亚站点覆盖农村区域,通过优化CCE资源映射方式(交织、非交织),提升RRC连接建立成功率和无线接通率。非交织方式相比交织方式有显著提升。 5G AAU两扇区组网:与三扇区组网相比,AAU两扇区组网在RSRP、SINR、下载速率和上传速率上表现不同,需根据具体场景选择适合的组网方式。 5G语音解决方案:包括沿用4G语音解决方案、EPS Fallback方案和VoNR方案。不同方案适用于不同的5G组网策略,如NSA和SA,并影响语音连续性和网络覆盖。 4G网络优化与资源利用: 4G室分设备利旧:面对4G网络投资压减与资源需求矛盾,提出利旧多维度调优策略,包括资源整合、统筹调配既有资源,以满足新增需求和提质增效。 宏站RRU设备1托N射灯:针对5G深度覆盖需求,研究使用宏站AAU结合1托N射灯方案,快速便捷地开通5G站点,提升深度覆盖能力。 基站与流程管理: 爱立信LTE基站邻区添加流程:未提供具体内容,但通常涉及邻区规划、参数配置、测试验证等步骤,以确保基站间顺畅切换和覆盖连续性。 网络规划与策略: 新高铁跨海大桥覆盖方案试点:虽未提供详细内容,但可推测涉及高铁跨海大桥区域的4G/5G网络覆盖规划,需考虑信号穿透、移动性管理、网络容量等因素。 总结: 提供的参考资料涵盖了4G/5G无线网络优化、网规案例分析、网络优化策略、资源利用、基站管理等多个方面。 通过具体案例分析,展示了无线网络优化中的常见问题及解决方案,如NSA终端掉4G、RSSI识别天馈遮挡、CA不生效等。 强调了5G网络优化与策略的重要性,包括CCE映射方式优化、5G语音解决方案、AAU扇区组网选择等。 提出了4G网络优化与资源利用的策略,如室分设备利旧、宏站RRU设备1托N射灯等。 基站与流程管理方面,提到了爱立信LTE基站邻区添加流程,但未给出具体细节。 新高铁跨海大桥覆盖方案试点展示了特殊场景下的网络规划需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值