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

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

🍁 作者:知识浅谈,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」命令的报错记录
1270 0
Superset执行「superset db upgrade」命令的报错记录
|
SQL 人工智能 分布式计算
基于阿里云PAI平台搭建知识库检索增强的大模型对话系统
基于原始的阿里云计算平台产技文档,搭建一套基于大模型检索增强答疑机器人。本方案已在阿里云线上多个场景落地,将覆盖阿里云官方答疑群聊、研发答疑机器人、钉钉技术服务助手等。线上工单拦截率提升10+%,答疑采纳率70+%,显著提升答疑效率。
|
Swift iOS开发 C++
设置Swift开发环境
设置Swift开发环境
331 1
|
机器学习/深度学习 人工智能 算法
认识AI,探索AI如何奇思妙想
AI的快速演进正在加速AGI的到来,不止步于工具的AI让我们意识到它也绝不仅仅意味着算法和代码。当我们真的把人工智能当作智能体的时候总要去思考“AI是什么”这一个问题。关于意识的理论模型各自提供了意识产生机制于AI的不同解释,目前尚无定论,但它们都在学术界激发了广泛的讨论与研究。也欢迎你在评论区聊聊你会怎么向别人介绍AI?你认为AI是如何奇思妙想的,它具有意识吗?
643 0
ACM刷题之路(十六)Acm程序设计竞赛自制模板(一)
ACM刷题之路(十六)Acm程序设计竞赛自制模板
302 0
|
关系型数据库 分布式数据库 数据库
VLDB顶会论文解读|PolarDB MySQL高性能强一致集群核心技术详解
论文中,PolarDB-SCC提出了一个全局强一致的主从架构的云原生数据库。目前该架构已在PolarDB架构中上线一年有余,是业内首个在业务无感知情况下实现全局一致性读的主从架构云原生数据库,解决了一直以来海量客户的一致性痛点。
|
SQL Java 关系型数据库
hive中 sql执行过程
hive中 sql执行过程
423 0
|
存储 分布式计算 NoSQL
阿里面试官:分布式锁到底用Redis好?还是Zookeeper好?
阿里面试官:分布式锁到底用Redis好?还是Zookeeper好?
177 0
阿里面试官:分布式锁到底用Redis好?还是Zookeeper好?
《云上大型赛事保障白皮书》——第六章 云产品稳定性治理与风险管控——6.2 北京冬奥稳定性治理实践——6.2.3 冬奥重保--风险巡检(2)
《云上大型赛事保障白皮书》——第六章 云产品稳定性治理与风险管控——6.2 北京冬奥稳定性治理实践——6.2.3 冬奥重保--风险巡检(2)
189 0
|
前端开发 开发者
CSS 样式规则| 学习笔记
快速学习 CSS 样式规则。
CSS 样式规则| 学习笔记