用两个小例子来解释单例模式中的“双重锁定”

简介: 学习单例模式时,好多人都不太理解双重锁定。学完后突然想到一个很有趣的例子。

 学习单例模式时,好多人都不太理解双重锁定。学完后突然想到一个很有趣的例子。


34.jpg


       代码:

       Singleton类


    class Singleton
    {
        private static Singleton instance;
        private static readonly object syncRoot = new object();  //程序运行时创建一个静态只读的进程辅助对象
        private Singleton() { }                 //用private修饰构造方法,防止外界利用new创建此类实例
        public static Singleton GetInstance()
        {
            if (instance == null)               //若instance对象为null,则继续
            {
                lock (syncRoot)                 //↓↓↓↓在同一时刻加了锁的这部分程序只有一个线程可以进入↓↓↓↓
                {
                    if (instance == null)//如果instance对象为null,则为它分配实例
                    {
                        instance = new Singleton();
                    }
                }                               //↑↑↑↑在同一时刻加了锁的这部分程序只有一个线程可以进入↑↑↑↑
            } 
            return instance;
        }
    }


           客户端代码


    static void Main(string[] args)
    {
        Singleton singleton1=Singleton.GetInstance();
        Singleton singleton2=Singleton.GetInstance();
        //……
    }


           说明:


     《大话设计模式》中,小菜问道:“我在外面已经判断了instance实例是否存在,为什么在lock里面还要做一次instance实例是否存在的判断呢?”


      大鸟是这么回答的:当instance为null并且同时有两个线程调用GetInstance方法时,他们将都可以通过第一重instance==null的判断。然后由于lock机制,这两个线程则只有一个进入,另外一个在外排队等候,必须要其中的一个进入并出来后,另一个才能进入,而此时如果没有了第二重的instance是否为null的判断,则第一个线程创建了实例,第二个线程还是可以继续再创建新的实例,这就没有达到单例的目的。


      如果觉得大鸟的话不太好理解,可以看看这个例子:


      ——如果我和你妈掉进河里,你先救谁?——当然救我妈,宁愿睡沙发!


      在一个200元时装店(顾名思义,所有的衣服都是200元),妈妈看中一件200元的衣服,媳妇也看中一件200元的衣服,但我只有200块钱(所以只能买一件),尽管如此,作为儿子和丈夫的我也得掏钱啊。【PS:此处相当于代码中的客户端调用,singleton1为给老妈买衣服,singleton2为给媳妇买衣服】


      我走进商店时,跟店员说,我想买衣服,店员说:“那你有200快钱吗?没钱就赶紧出去!”。【PS:此处为第一层判断】


      经过深思熟虑,百善孝为先,我买了老妈看中的那件衣服。【给老妈买衣服的线程成功执行,给媳妇买衣服的线程被锁在外面】


      那媳妇的衣服怎么办?踱来踱去还想买另一件时,店员问我:“你有200块钱吗?没钱就赶紧出去!”于是我出去了。【PS:第二层判断,我没钱了,所以出去了,今晚回去肯定又得睡沙发了T_T…T_T…T_T】


      讲完这个故事,突然又想到一件事,就再啰嗦几句,爆爆料。


      打倒花心大萝卜!


          大家都听说过Darry Ring钻戒,它的宗旨是“用一生给你一个唯一的承诺”,即一个男人一生只能凭身份证买一个。


      话说几十年前看上一位漂亮的女子,为了表达爱慕,为她买了一枚Darry Ring,女子被感动,顺利追到手,当时还纳闷为什么买钻戒还要填写身份证号,不过也没在意。前几天又看上一女子,于是花心的我想脚踏两条船,想再买一枚Darry Ring追求之,麻烦来了,买钻戒的时候,工作人员告诉我说,我已经买过Darry Ring的戒指,而一个男人一生只能凭身份证买一枚……我去!什么鸟规定!于是忍痛挥泪和女神说拜拜T_T…T_T…T_T


35.jpg


相关文章
|
并行计算 Docker 容器
Mamba 环境安装:causal-conv1d和mamba-ssm报错解决办法
Mamba 环境安装:causal-conv1d和mamba-ssm报错解决办法
4649 0
|
6月前
|
人工智能 开发者
文章和 PPT 配图有救了!SVG 绘图专家智能体大揭秘
本文分享如何使用 DeepSeek-V3-0324 和 Claude 3.5 或 3.7 绘制出高质量的图片,可以作为文章配图也可以为 PPT 配图,效率成倍增长。文章还介绍了原型图绘制、图片重绘修改和彩色报纸风的进阶案例。希望本文提供的技巧对大家有帮助,大家也可以修改提示词定制自己喜欢的风格。
361 13
|
数据可视化 API 异构计算
一分钟部署 Llama3 中文大模型,没别的,就是快
Meta开源了80亿和700亿参数的大模型,挑战百度创始人李彦宏的观点。这些模型在性能上逼近GPT-4和Claude3。此外,一个400B的超大模型即将发布。Huggingface上已有多个Llama3中文微调版本。无GPU用户可使用量化模型在CPU上运行,如8B模型用8bit量化,70B模型用4bit量化。最佳中文微调版是zhouzr/Llama3-8B-Chinese-Chat-GGUF,可在三分钟内通过Sealos公有云快速部署,搭配WebUI如Lobe Chat进行交互。
855 3
|
9月前
|
机器学习/深度学习 人工智能 弹性计算
阿里云AI服务器价格表_GPU服务器租赁费用_AI人工智能高性能计算推理
阿里云AI服务器提供多种配置,包括CPU+GPU、FPGA等,适用于人工智能、机器学习和深度学习等计算密集型任务。本文整理了阿里云GPU服务器的优惠价格,涵盖NVIDIA A10、V100、T4等型号,提供1个月、1年和1小时的收费明细。具体规格如A10卡GN7i、V100-16G卡GN6v等,适用于不同业务场景,详情见官方页面。
820 11
|
机器学习/深度学习 人工智能 自然语言处理
【热门开源项目】阿里开源巨擘:Qwen-2 72B深度解析与推荐
在人工智能的浪潮中,开源模型如同璀璨的星辰,指引着开发者们探索未知的领域。而今天,我们将聚焦在阿里云推出的开源模型Qwen-2 72B上,从其项目介绍、技术特点、代码解析等多个角度,深入解析并推荐这一卓越的开源项目。
548 1
|
缓存 监控 JavaScript
【Vue面试题二十六】、SSR解决了什么问题?有做过SSR吗?你是怎么做的?
这篇文章详细介绍了服务端渲染(SSR)的原理、解决了哪些问题、以及如何在Vue应用中实现SSR,包括项目配置、代码结构、路由配置、数据预取和服务器端的渲染流程。
【Vue面试题二十六】、SSR解决了什么问题?有做过SSR吗?你是怎么做的?
|
运维 Kubernetes 数据可视化
【Docker管理工具】使用Docker部署portainer-ce管理工具
【7月更文挑战第22天】使用Docker部署portainer-ce管理工具
1314 3
【Docker管理工具】使用Docker部署portainer-ce管理工具
|
Linux C语言
教你在QEMU上运行RISC-V Linux
教你在QEMU上运行RISC-V Linux
|
Python 数据采集 安全
淘宝商品评论数据爬取:Python实战指南
淘宝商品评论数据的自动爬取可以为市场分析和用户行为研究提供宝贵的信息资源。然而,这一过程需要严格遵守法律法规,尊重数据的版权和隐私。通过合理利用Python的网络爬虫技术,可以在遵循道德规范的前提下,高效地完成数据采集任务。 通过本文的指南,希望你能对淘宝商品评论数据的爬取有一个清晰的认识,并能够安全、合法地进行数据采集。
|
分布式计算 大数据 Java
大数据开发语言Scala入门
大数据开发语言Scala入门