首页 > 其他分享 >.Net core 常见同步机制及其应用场景

.Net core 常见同步机制及其应用场景

时间:2023-11-24 11:36:36浏览次数:34  
标签:core 场景 Monitor lock 临界 同步 线程 Net 机制

在 .NET Core 5 中,提供了多种同步机制来处理多线程同步问题,下面分别介绍这些同步机制及其适用场景。

  • lock 关键字
    lock 关键字是 C# 语言提供的一种基本的同步机制,可以用于保护临界区,确保多个线程对共享资源的访问互斥性。使用 lock 关键字时,需要指定一个对象作为锁,这个锁对象可以是任何类型的实例,但应该是所有需要同步的线程所共享的对象。一般情况下,使用 lock 关键字来实现轻量级的同步机制,适用于对临界区的保护和控制,例如:
private object _lockObject = new object();
public void ProcessData()
{
    lock (_lockObject)
    {
        // 临界区代码
    }
}
  • Monitor 类
    Monitor 类是 .NET 中较为底层的同步机制,也是基于互斥锁的同步机制,可以用于实现临界区的保护,确保多个线程之间的安全访问。与 lock 关键字不同的是,Monitor 类提供了更多的同步方法,例如 Enter、Exit、TryEnter 等,可以更灵活地控制同步过程。一般情况下,使用 Monitor 类可以实现更细粒度的同步控制,适用于对临界区的保护和控制,例如:
private object _lockObject = new object();
public void ProcessData()
{
    Monitor.Enter(_lockObject);
    try
    {
        // 临界区代码
    }
    finally
    {
        Monitor.Exit(_lockObject);
    }
}
  • SemaphoreSlim 类
    SemaphoreSlim 类是一个轻量级的同步机制,用于限制同时访问某个资源的线程数。与 Semaphore 类相比,SemaphoreSlim 类具有更低的资源消耗,更快的响应速度和更好的可扩展性,适用于控制线程并发访问的场景。例如:
private SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1);
public async Task ProcessDataAsync()
{
    await _semaphore.WaitAsync();
    try
    {
        // 临界区代码
    }
    finally
    {
        _semaphore.Release();
    }
}
  • Mutex 类
    Mutex 类是一种基于内核对象的同步机制,可以用于实现多个进程之间的同步。与 Semaphore 类似,Mutex 类也可以用于限制同时访问某个资源的线程数,但在跨进程同步方面更为常见。例如:
private Mutex _mutex = new Mutex();
public void ProcessData()
{
    _mutex.WaitOne();
    try
    {
        // 临界区代码
    }
    finally
    {
        _mutex.ReleaseMutex();
    }
}
  • Interlocked 类
    Interlocked 类提供了原子操作和内存屏障等高级同步机制,可以保证多个线程对某个变量的读写操作是原子性的,避免出现竞态条件等并发问题。例如:
private int _counter = 0;
public void Increment()
{
    Interlocked.Increment(ref _counter);
}

标签:core,场景,Monitor,lock,临界,同步,线程,Net,机制
From: https://www.cnblogs.com/Alicia-meng/p/17853341.html

相关文章

  • log4net使用过程
    1.安装log4net,通过Nuget下载2.在AssemblyInfo.cs中添加[assembly:log4net.Config.XmlConfigurator(ConfigFile="log4net.config",ConfigFileExtension="config",Watch=true)]3.编写log4net.config,放在工程目录和exe目录<?xmlversion="1.0"?......
  • 平台工程时代的 Kubernetes 揭秘:2023年生产状况报告深度剖析
    Kubernetes在生产环境中的复杂性已经成为常态,在2023年这个平台工程盛行的时代,容器管理的最大亮点可能在于其灵活性,然而在运维政策和治理等方面仍然存在诸多挑战。八年过去了,在生产环境中使用Kubernetes仍然需要面临许多挑战。 SpectroCloud刚刚与DimensionalResearch合......
  • ConfigureAwait in .NET8
    ConfigureAwaitin.NET8ConfigureAwait(true)和ConfigureAwait(false)首先,让我们回顾一下原版ConfigureAwait的语义和历史,它采用了一个名为continueOnCapturedContext的布尔参数。当对任务(Task、Task<T>、ValueTask或ValueTask<T>)执行await操作时,其默认行为是捕获“上......
  • 在.net中使用AutoMapper进行对象映射,对象相互转,简单方便
    AutoMapper是一种对象映射工具,它可以帮助我们将不同类型的数据对象之间进行相互转换。在.NET中,我们可以使用AutoMapper库来简化数据对象之间的映射操作,从而提高代码的可读性和可维护性。一、AutoMapper的安装和基本使用安装AutoMapper首先,我们需要在项目中安装AutoMapper库。......
  • .net 温故知新【13】:Asp.Net Core WebAPI 缓存
    一、缓存缓存指在中间层中存储数据的行为,该行为可使后续数据检索更快。从概念上讲,缓存是一种性能优化策略和设计考虑因素。缓存可以显著提高应用性能,方法是提高不常更改(或检索成本高)的数据的就绪性。二、RFC9111在最新的缓存控制规范文件RFC9111中,详细描述了浏览器缓存和服务......
  • 掌握VB.net编程技巧,轻松打造Windows应用
    为了温故而知新,本博客旨在记录我学习VB.net编程的过程,分享基础知识和实用技巧,帮助有需要的朋友轻松入门VB.net编程。无论您是想开发Windows平台上的应用程序,还是想在.NET生态系统中展现创造力和创新精神,本文都将为您提供宝贵的指导。VB.net是一种易学易用的编程语言,它基于Microso......
  • (15-418)Lecture 2 A Modern Multi-Core Processor
    并行执行的方式本节内容围绕一个程序,针对如何改变处理器的结构来加速程序提出了多个idea示例程序:该程序通过泰勒展开式来估算sin(x)的值一个最简单的处理器,每个时钟周期只能执行一条指令,而利用ILP(指令级平行)的超标量处理器可同时执行两条指令(当指令间不存在依赖时),但示例程序......
  • 一键删除Oracle alert,audit,background,core,user,Clusterware logs脚本
    #!/bin/bash##ScriptusedtocleanupanyOracleenvironment.##Cleans:audit_log_dest#background_dump_dest#core_dump_dest#user_dump_dest#Clusterwarelogs##Rotates:AlertLogs#......
  • dpvs启动时coredump
    问题现象问题分析#根据core文件来打印堆栈信息gdb-clcore-worker-2.core.20196/root/code/dpvs/bin/dpvs解决问题大页内存2G不足导致段错误,分配4G后正常。......
  • .Net Core MVC超大文件上传
    后端控制器://用于保存的文件夹staticreadonlystringuploadFolder="UploadFolder";//目录分隔符,兼容不同系统staticreadonlychardirSeparator=Path.DirectorySeparatorChar;stringGetTmpChunkDir(stringfileName)=>HttpContext.Session.TryGet......