首页 > 其他分享 >lock 为什么要传入一个object对象

lock 为什么要传入一个object对象

时间:2024-08-29 19:27:20浏览次数:10  
标签:Singleton 传入 对象 lock object 实例 static

lock 为什么要传入一个object对象

public class Singleton
{
    public static Singleton instance;
    public static readonly object singletonLock = new object();

    private Singleton() { }

    public static Singleton GetInstance()
    {
        if (instance == null)
        {
            lock (singletonLock)
            {
                if (instance == null)
                {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

internal class Program
{
    private static void Main(string[] args)
    {
        Singleton singleton = Singleton.GetInstance();
        Singleton singleton2 = Singleton.GetInstance();
        System.Console.WriteLine(singleton == singleton2);
    }
}

在这个 Singleton 类的实现中,lock 语句用于保证线程安全地创建单例实例。lock 关键字需要一个对象作为锁的对象,这个对象通常被称为“互斥锁”或者“锁对象”。

这里使用 static readonly object singletonLock = new object(); 初始化了一个静态的、不可变的对象来作为锁。选择一个新的 object 实例而不是像 lock (this) 或者其他实例成员是因为在构造函数执行之前,this 关键字并不指向一个完全构造好的对象实例,因此不能用 this 作为锁对象。同时,如果使用类的其他实例成员作为锁,则可能会导致多个锁实例,从而破坏了锁的目的。

通过使用一个专用的静态 object 锁,可以确保所有对 GetInstance 方法的调用共享同一个锁对象,这样可以正确地防止多个线程同时进入临界区(即创建单例实例的部分代码)。

总结一下,lock (singletonLock) 中的 singletonLock 对象的作用是:

  1. 提供一个唯一的锁定点,确保多线程环境下的原子性。
  2. 避免使用 this 或其他可能不稳定的引用作为锁。
  3. 保证线程安全地初始化单例实例。

标签:Singleton,传入,对象,lock,object,实例,static
From: https://www.cnblogs.com/zhuoss/p/18385816

相关文章

  • 数据存储“取经路”,HBlock轻松“渡”!
    近日,天翼云联合权威科技媒体InfoQ举办了以“新存储,更轻量”为主题的线上技术分享会。天翼云存储产品线总监武志民讲解了HBlock的创新设计和技术。高性能·高可用·高可靠自研创新解决存储技术难题 天翼云自主研发的业内首款存储资源盘活系统HBlock能够与底层基础设施完全解耦,......
  • MySQL 使用pt-osc添加索引Lock wait timeout exceeded管窥
    1.pt-osc工具1.1.pt-osc简介pt-osc是pt-online-schema-change的简写,pt-online-schema-change是percona-toolkit工具包中用于在线变更DDL的工具1.2.pt-osc原理1.3.pt-toolkit安装#yuminstallperl-ExtUtils-CBuilderperl-ExtUtils-MakeMakercpan#yumload-transaction......
  • 训练yolov5时出现报错:AttributeError: ‘FreeTypeFont‘ object has no attribute ‘g
    报错:Traceback(mostrecentcalllast):File"D:\anaconda3_xz\envs\luopytorch\lib\threading.py",line932,in_bootstrap_innerself.run()File"D:\anaconda3_xz\envs\luopytorch\lib\threading.py",line870,inrunself._target(*s......
  • AutoSynth: Learning to Generate 3D Training Datafor Object Point Cloud Registrat
    目录一、导言二、先导知识1、进化算法概述2、4pcs算法3、Super4PCS算法三、相关工作1、传统点云配准工作2、基于深度学习的点云配准3、生成训练数据集四、AutoSynth框架1、搜索空间2、进化算法3、代理任务模型五、实验 1、测试数据集2、BOP评估指标3、对比实......
  • 翻译_Clock Domain Crossing Design
    翻译_ClockDomainCrossingDesign原文标题及连接:ClockDomainCrossing(CDC)Design&VerificationTechniquesUsingSystemVerilog.作者:CliffordE.CummingsSunburstDesign,[email protected]摘要在多时钟设计中,需要在时钟域交叉(ClockDomainC......
  • 单例模式 lock 多线程 双重检查锁定机制
    单例模式单例模式publicclassSingleton{//定义一个静态变量来保存类的实例privatestaticSingletonuniqueInstance;//定义一个标识确保线程同步privatestaticreadonlyobjectlocker=newobject();//定义私有构造函数,使外界不能创建该类......
  • 【已解决】Vue Duplicate keys detected: ‘[object Object]’
    【已解决】VueDuplicatekeysdetected:‘[objectObject]’在Vue项目开发过程中,我们可能会遇到这样的报错:“Duplicatekeysdetected:‘[objectObject]’.Thismaycauseanupdateerror.”。这个错误通常发生在Vue的虚拟DOM进行渲染更新时,如果检测到重复的key值,就......
  • Object类型编译基本类型
    byte&short&intObjecta=1;//字节码0iconst_11invokestatic#2<java/lang/Integer.valueOf>4astore_15returnObjecta=127;//字节码0bipush1272invokestatic#2<java/lang/Integer.valueOf>5astore_16returnObjec......
  • C++学习随笔——lock_guard和mutex的使用方法
    std::mutex和std::lock_guard是C++标准库中用于多线程同步的工具,主要用于防止多个线程同时访问共享资源,导致数据竞争问题。 std::mutex是一个用于互斥锁的类,提供了锁定(lock)和解锁(unlock)的功能。使用方法:#include<iostream>#include<thread>#include<mutex>std::......
  • 【ACMMM2024】Multi-Scale and Detail-Enhanced Segment Anything Model for Salient
    论文:https://arxiv.org/pdf/2408.04326代码:https://github.com/BellyBeauty/MDSAM论文的研究动机就是使用SAM来解决显著性检测(SOD)问题,主要有两个改进:提出了LightweightMulti-ScaleAdapter,LMSA来微调SAM提出了Multi-LevelFusionModule,MLFM和DetailEnhancementM......