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

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

🍁 作者:知识浅谈,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种设计模式种的单例模式浅谈,希望有所帮助。

相关文章
|
5月前
|
SQL 关系型数据库 数据库
【数据库】多表关系与多表查询-全维度对比(附《思维导图》)
本文系统讲解多表关系与多表查询,涵盖底层原理、范式设计、JOIN/UNION/子查询语法、CTE递归、性能优化及高频避坑指南,适配MySQL/PostgreSQL,助你从入门直达企业级实战。
|
7月前
|
机器学习/深度学习 自然语言处理 算法
大模型和机器学习
本文系统解析大模型与机器学习的关系,指出大模型是机器学习在“大参数、大数据、大算力”下的进化形态,二者为包含与被包含关系。文章从技术本质、能力特点、应用场景等10个维度对比分析,强调两者非替代而是互补,并展望融合发展趋势。
852 3
|
4月前
|
安全 Linux Shell
Metasploit Pro 5.0.0-2026040201 (Linux, Windows) - 专业渗透测试框架
Metasploit Pro 5.0.0-2026040201 (Linux, Windows) - 专业渗透测试框架
268 2
|
6月前
|
数据采集 自然语言处理 搜索推荐
电商行业有哪些agent应用:从 Quick Service 到 Dataphin 的智能革命
本文探讨Agent(智能体)如何驱动电商从“经验驱动”迈向“智能驱动”,聚焦Quick Service(全链路智能客服)、Quick BI“智能小Q”(对话式数据分析)、Data Agent(智能数据管家)与Dataphin(智能数据底座)四大技术实践,重塑运营、决策、履约与服务全链路。(239字)
电商行业有哪些agent应用:从 Quick Service 到 Dataphin 的智能革命
|
5月前
|
人工智能
新手也能上手:AI生成网站从0到上线的完整流程
新手建站常被代码、服务器、域名配置劝退?如今AI建站已大幅简化流程:只需描述需求(如“科技公司产品展示站”),AI即可自动生成首页、产品页等基础结构,再通过拖拽编辑内容、图片,一键发布上线。无需编程,快速打造专业官网。
|
8月前
|
SQL 容灾 Nacos
Seata的部署和集成
本文介绍Seata分布式事务框架的部署与集成。首先下载并解压seata-server-1.5.1,修改application.yml配置,将seataServer.properties配置上传至Nacos作为统一配置中心,并创建所需数据库表。启动tc-server后,注册到Nacos,通过控制台可查看服务状态。各微服务需引入Seata依赖,并在application.yml中配置相关参数。为实现高可用,可搭建多节点TC集群,如GZ和HZ集群,通过Nacos统一管理事务组映射,微服务从Nacos读取client.properties配置,动态切换TC集群连接,提升系统容灾能力。
495 0
|
自然语言处理
|
机器学习/深度学习 人工智能 PyTorch
【AI系统】计算图基本介绍
近年来,AI框架如TensorFlow和PyTorch通过计算图描述神经网络,推动了AI技术的发展。计算图不仅抽象了神经网络的计算表达,还支持了模型算子的高效执行、梯度计算及参数训练。随着模型复杂度增加,如MOE、GAN、Attention Transformer等,AI框架需具备快速分析模型结构的能力,以优化训练效率。计算图与自动微分紧密结合,实现了从前向计算到反向传播的全流程自动化。
444 4
【AI系统】计算图基本介绍
|
设计模式 Java Spring
Spring Boot使用责任链模式优化业务逻辑中的if-else代码
在开发过程中,我们经常会遇到需要根据不同的条件执行不同的逻辑的情况。传统的做法是使用if-else语句来进行条件判断,但是随着业务逻辑的复杂化,if-else语句会变得越来越臃肿,难以维护和扩展。这时候,我们可以考虑使用责任链模式来优化代码结构,使得代码更加清晰、可扩展和易于维护。
|
存储 缓存 运维
阿里云经济型e与通用算力型u1实例性能、适用场景及常见问题
在阿里云的众多云服务器实例类型中,经济型e和通用算力型u1实例因其高性价比和广泛的适用性而备受青睐。2024年经济型e实例2核2G3M带宽40G ESSD Entry盘99元1年,通用算力型u1实例2核4G5M带宽80G ESSD Entry盘199元1年,本文将深入解析这两种实例的性能特点、适用场景以及购买建议,以供参考。
阿里云经济型e与通用算力型u1实例性能、适用场景及常见问题