大佬,人人都说精通的单例模式,你精通了吗

简介: 大佬,人人都说精通的单例模式,你精通了吗

🍁 作者:知识浅谈,CSDN签约讲师,CSDN博客专家,华为云云享专家,阿里云专家博主

📌 擅长领域:全栈工程师、爬虫、ACM算法

💒 公众号:知识浅谈

🔥 联系方式vx:zsqtcc

🤞大佬,人人都说精通的单例模式,你精通了吗🤞

正菜来了⛳⛳⛳

概括起来,要实现一个单例,需要关注的点有下面几个:

  • 构造函数需要是private访问权限的,这样才能避免外部通过new创建实例;
  • 考虑对象创建时的线程安全问题;
  • 考虑是否支持延迟加载:
  • 考虑getlnstance0性能是否高(是否加锁)

🎈饿汉式

类加载时直接实例化单例对象

饿汉式的实现方式比较简单。在类加载的时候,instance静态实例就已经创建并初始化好了,所以,instance实例的创建过程是线程安全的。不过,这样的实现方式不支持延迟加载(在真正用到IdGenerator的时候,再创建实例),从名字中我们也可以看出这一点。

具体的代码实现如下所示:

public class Main { 
    //在类加载的时候就已经实例化好了,不好的地方就是如果用不到就相当于无效占用空间了,但是不会出现多线程的问题
    private static Main test = new Main();
    private Main(){}
    public Main getInstance(){
      return test;
    }
    public static void main(String[] args) {
        System.out.println(Main.test);
    }
}

🎈懒汉式

🍮双重检查模式

之所以双重检查,为了保证多线程创建多个对象形成覆盖的问题。

为什么使用volatile,是因为只有加了volatile,才能保证可见性,在不同的线程中对象的变量值都是可见的。

public class Main {
    private static volatile Main test;
    private Main(){}
    public static Main getInstance(){
        if(test==null){
            synchronized (Main.class){
                if(test==null) test = new Main();
            }
        }
        return test;
    }
    public static void main(String[] args) throws InterruptedException {
        ExecutorService executorService = Executors.newFixedThreadPool(5);
        CountDownLatch count = new CountDownLatch(5);
        for (int i = 0; i < 5; i++) {
            executorService.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Main.getInstance());
                    count.countDown();
                }
            });
        }
        count.await();
        executorService.shutdown();
    }
}

🍮静态内部类模式

主要用到的原理是 首先静态内部类只有在调用的时候,第一次进行初始化,也就是单例对象只在第一次调用的时候创建

public class Main {
    private Main(){}
    static class A{
        private static Main test = new Main();
    }
    public static Main getInstance(){
        return A.test;
    }
    public static void main(String[] args) throws InterruptedException {
        ExecutorService executorService = Executors.newFixedThreadPool(5);
        CountDownLatch count = new CountDownLatch(5);
        for (int i = 0; i < 5; i++) {
            executorService.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Main.getInstance());
                    count.countDown();
                }
            });
        }
        count.await();
        executorService.shutdown();
    }
}

🍚总结

以上就是个人对23种设计模式种的单例模式浅谈,希望有所帮助。

相关文章
|
数据可视化 BI 数据库
Superset执行「superset db upgrade」命令的报错记录
Superset执行「superset db upgrade」命令的报错记录
1348 0
Superset执行「superset db upgrade」命令的报错记录
|
SQL 人工智能 分布式计算
基于阿里云PAI平台搭建知识库检索增强的大模型对话系统
基于原始的阿里云计算平台产技文档,搭建一套基于大模型检索增强答疑机器人。本方案已在阿里云线上多个场景落地,将覆盖阿里云官方答疑群聊、研发答疑机器人、钉钉技术服务助手等。线上工单拦截率提升10+%,答疑采纳率70+%,显著提升答疑效率。
|
2月前
|
SQL 关系型数据库 数据库
【数据库】多表关系与多表查询-全维度对比(附《思维导图》)
本文系统讲解多表关系与多表查询,涵盖底层原理、范式设计、JOIN/UNION/子查询语法、CTE递归、性能优化及高频避坑指南,适配MySQL/PostgreSQL,助你从入门直达企业级实战。
|
1月前
|
人工智能 数据挖掘 语音技术
5个AI Skill实测:影视内容创作全流程自动化
AI能力上限取决于装了什么Skill!本文推荐影视博主必装5大技能:热点选题、AI解说视频、智能字幕、数据复盘、多平台发布,覆盖创作全流程,30分钟搞定原需4-5小时的工作,效率跃升10倍。(239字)
|
2月前
|
存储 安全 Java
2026年阿里云短信服务全攻略:从入门到精通的实战指南
阿里云短信服务是稳定可靠、高到达率的企业级通信平台,支持验证码、通知及营销短信发送。国内短信秒级触达,到达率高达99%;国际覆盖200+国家和地区。文档详述了从企业认证、资质备案、签名模板申请,到API接入(Java/PHP示例)、安全配置及常见问题的全流程,助力开发者高效集成。
|
3月前
|
数据采集 自然语言处理 搜索推荐
电商行业有哪些agent应用:从 Quick Service 到 Dataphin 的智能革命
本文探讨Agent(智能体)如何驱动电商从“经验驱动”迈向“智能驱动”,聚焦Quick Service(全链路智能客服)、Quick BI“智能小Q”(对话式数据分析)、Data Agent(智能数据管家)与Dataphin(智能数据底座)四大技术实践,重塑运营、决策、履约与服务全链路。(239字)
电商行业有哪些agent应用:从 Quick Service 到 Dataphin 的智能革命
|
2月前
|
人工智能
新手也能上手:AI生成网站从0到上线的完整流程
新手建站常被代码、服务器、域名配置劝退?如今AI建站已大幅简化流程:只需描述需求(如“科技公司产品展示站”),AI即可自动生成首页、产品页等基础结构,再通过拖拽编辑内容、图片,一键发布上线。无需编程,快速打造专业官网。
|
3月前
|
安全 Linux 文件存储
别再给音箱充会员了!手把手教你把小爱音箱变成“私人点唱机”
小爱音箱只能听受限音乐?开源神器XiaoMusic来了!它让小爱直连你的NAS/网盘/本地音乐库,支持FLAC/WAV无损播放,语音控制“小爱同学,播放《七里香》”即刻响应。Docker一键部署,Web后台管理,免费、安全、不刷机。守着宝库,终于有了钥匙!
861 1
|
存储 缓存 运维
阿里云经济型e与通用算力型u1实例性能、适用场景及常见问题
在阿里云的众多云服务器实例类型中,经济型e和通用算力型u1实例因其高性价比和广泛的适用性而备受青睐。2024年经济型e实例2核2G3M带宽40G ESSD Entry盘99元1年,通用算力型u1实例2核4G5M带宽80G ESSD Entry盘199元1年,本文将深入解析这两种实例的性能特点、适用场景以及购买建议,以供参考。
阿里云经济型e与通用算力型u1实例性能、适用场景及常见问题
|
Java 测试技术 API
拼多多 API 接口申请通过后如何进行测试?
拼多多 API 接口申请通过后,需按以下步骤测试:1. 仔细研读接口文档;2. 搭建测试环境,准备开发工具和模拟请求工具;3. 编写测试代码或使用测试工具;4. 设计测试用例,包括正常、异常和边界情况;5. 验证测试结果,检查返回值和错误处理;6. 记录和分析测试结果,确保 API 的稳定性和性能。

热门文章

最新文章