C#各种锁知识点

先上总结: 

锁类型特点适用场景优点缺点
自旋锁忙等待实现锁定,适合高并发短时间锁定高并发环境,短时间锁定,仅限单进程多线程同步开销低,避免线程上下文切换忙等待消耗CPU资源,不适合长时间锁定,不能跨进程使用
互斥锁提供独占访问,阻塞等待,适合长时间锁定需要跨线程或进程保护资源阻塞等待不占用CPU资源,支持跨进程开销高,可能导致死锁,涉及线程上下文切换
Redis分布式锁基于Redis的分布式锁定,适合分布式系统分布式环境中的资源协调适用于分布式系统,提供全局一致性锁依赖Redis服务,可能受网络延迟影响,需处理锁的过期和续期问题
lock关键字基于Monitor的代码块级同步机制,易用简单的线程同步,保护共享资源语法简单,自动处理异常需选择合适锁对象,粒度问题,不能跨进程使用,有线程上下文切换的开销

粒度:锁的粒度是指锁定代码块的范围。如果锁定范围太大,会减少并发性,影响性能。 尽量减少锁定代码块的大小,只锁定必要的部分。

 自旋锁(Spin Lock)

  • 特点:当线程尝试获取锁时,如果锁已经被其他线程持有,线程会不停地检查锁是否可用(即“自旋”),直到获取到锁为止。
  • 优点:适用于锁定时间很短的场景,避免了线程的上下文切换,提高了性能。
  • 缺点:如果锁定时间较长,自旋锁会导致CPU资源的浪费,因为线程会一直占用CPU时间进行忙等待。
  • 使用场景:适用于锁定时间极短的代码段,且需要避免线程上下文切换的开销。
using System;
using System.Threading;class SpinLockExample
{private volatile bool locked = false;public void Acquire(){while (true){if (!locked){locked = true;return;}Thread.SpinWait(1); // 自旋等待}}public void Release(){locked = false;}
}class Program
{static SpinLockExample spinLock = new SpinLockExample();static void CriticalSection(){Console.WriteLine($"{Thread.CurrentThread.Name} trying to acquire lock");spinLock.Acquire();Console.WriteLine($"{Thread.CurrentThread.Name} acquired lock");// Critical sectionThread.Sleep(1000);Console.WriteLine($"{Thread.CurrentThread.Name} releasing lock");spinLock.Release();}static void Main(){Thread[] threads = new Thread[3];for (int i = 0; i < threads.Length; i++){threads[i] = new Thread(CriticalSection);threads[i].Name = $"Thread {i+1}";threads[i].Start();}foreach (Thread thread in threads){thread.Join();}}
}

 

互斥锁 (Mutex)

特点

  • 互斥锁(Mutex)提供对资源的独占访问。线程如果无法获取锁,会被阻塞并放入等待队列。
  • Mutex 可以用于跨线程和跨进程的锁定。
  • 由操作系统管理,能够确保在一个进程中获得锁时,其他进程无法获得同一个锁。

适用场景

  • 需要在多个线程或多个进程之间同步访问共享资源。
  • 需要锁定时间可能较长的操作。
  • 在本地应用程序或服务中使用。

优点

  • 提供跨进程的锁定机制。
  • 阻塞等待,不占用CPU资源。
  • 适合长时间锁定的操作。

缺点

  • 开销较高,涉及线程上下文切换。
  • 可能导致死锁,特别是在嵌套锁定的情况下。
using System;
using System.Threading;class MutexExample
{static Mutex mutex = new Mutex();static void CriticalSection(){Console.WriteLine($"{Thread.CurrentThread.Name} trying to acquire lock");mutex.WaitOne();try{Console.WriteLine($"{Thread.CurrentThread.Name} acquired lock");// Critical sectionThread.Sleep(1000);}finally{Console.WriteLine($"{Thread.CurrentThread.Name} releasing lock");mutex.ReleaseMutex();}}static void Main(){Thread[] threads = new Thread[3];for (int i = 0; i < threads.Length; i++){threads[i] = new Thread(CriticalSection);threads[i].Name = $"Thread {i+1}";threads[i].Start();}foreach (Thread thread in threads){thread.Join();}}
}

Redis分布式锁

特点

  • Redis分布式锁利用Redis的单线程特性,通过设置键值对实现锁定。
  • 支持分布式环境下的锁定机制,多个节点可以通过共享的Redis实例实现同步。
  • 依赖Redis的高性能和高可用性,可以在大规模分布式系统中使用。

适用场景

  • 分布式系统中多个实例需要同步访问共享资源。
  • 跨多个节点的资源协调和管理。
  • 需要全局一致性的锁。

优点

  • 适用于分布式系统,提供全局一致性锁。
  • 高可用性和持久性,适用于大规模分布式环境。
  • 可以与Redis的其他功能(如发布/订阅、缓存)结合使用。

缺点

  • 依赖外部的Redis服务,可能受到网络延迟和服务可用性的影响。
  • 实现复杂,需要处理锁的过期、自动续期等问题。
  • 存在一定的性能开销,尤其是在高延迟网络环境下。
  • using StackExchange.Redis;
    using System;
    using System.Threading;class RedisLockExample
    {private static ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost");private static IDatabase db = redis.GetDatabase();private const string LockKey = "lockKey";public static bool AcquireLock(string lockKey, TimeSpan expiry){return db.StringSet(lockKey, "locked", expiry, When.NotExists);}public static void ReleaseLock(string lockKey){db.KeyDelete(lockKey);}static void CriticalSection(){while (!AcquireLock(LockKey, TimeSpan.FromSeconds(5))){Thread.Sleep(100); // wait and retry}try{Console.WriteLine($"{Thread.CurrentThread.Name} acquired lock");// Critical sectionThread.Sleep(1000);}finally{Console.WriteLine($"{Thread.CurrentThread.Name} releasing lock");ReleaseLock(LockKey);}}static void Main(){Thread[] threads = new Thread[3];for (int i = 0; i < threads.Length; i++){threads[i] = new Thread(CriticalSection);threads[i].Name = $"Thread {i + 1}";threads[i].Start();}foreach (Thread thread in threads){thread.Join();}}
    }
    

 lock关键字

特点

  • lock 关键字基于 Monitor 实现,线程如果无法获取锁,会被阻塞并放入等待队列。
  • 适用于大多数普通的多线程同步场景,锁定时间可以较长。
  • 自动处理异常情况,确保在异常发生时释放锁。

优点

  • 使用方便,语法简洁。
  • 在等待锁时,线程不会消耗CPU资源。
  • 自动处理异常,确保锁的释放。

缺点

  • 有线程上下文切换的开销。
  • 需要选择合适的锁对象,避免锁定 this 或公共对象。
  • 不能跨进程使用。
class LockExample
{private readonly object lockObj = new object();public void CriticalSection(){lock (lockObj){// Critical section}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/48631.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

组队学习——贝叶斯分类器

前言 本次数据继续沿用上一次主题的【组队学习——支持向量机-CSDN博客】 数据处理部分延续【组队学习——支持向量机】主题的处理办法对应划分训练集和验证集 模型选择 本次贝叶斯分类器模型的较多&#xff0c;常用的为高斯朴素贝叶斯分类器、多项式朴素贝叶斯分类器、伯努…

配置文件格式 XML 快速上手

文章目录 1.语法2.实例3.解析参考文献 XML&#xff08;Extensible Markup Language&#xff09;是可扩展标记语言&#xff0c;用来传输和存储数据。因为其允许用户自定义标记名称&#xff0c;具有自我描述性&#xff0c;可灵活地用于存储服务配置信息。 1.语法 XML 文档结构是…

JavaWeb总结

终于结束了JavaWeb的学习&#xff0c;个人感觉其实就是学习客户端与服务端交互的中间件&#xff0c;以及服务端处理的逻辑&#xff0c;来帮助我们构建整个项目的运转逻辑&#xff0c;从客户端到服务器再到客户端&#xff0c;核心是围绕着一系列的请求和响应如何处理&#xff0c…

嵌入式Linux学习: platform 设备驱动实验

在Linux中&#xff0c;Platform&#xff08;平台&#xff09;机制是一个重要的设备驱动管理框架&#xff0c;它主要在Linux 2.6内核及以后的版本中引入。Platform机制的主要目的是提供一种统一的方式来管理那些不直接挂靠在传统物理总线&#xff08;如USB、PCI、I2C、SPI等&…

信息学奥赛一本通 1270:【例9.14】混合背包

【题目描述】 一个旅行者有一个最多能装V公斤的背包&#xff0c;现在有n件物品&#xff0c;它们的重量分别是W1&#xff0c;W2&#xff0c;…,Wn &#xff0c;它们的价值分别为C1,C2,…,Cn。有的物品只可以取一次&#xff08;01背包&#xff09;&#xff0c;有的物品可以取无限…

如何理解ref toRef和toRefs

是什么 ref 生成值类型的响应式数据可用于模板和reactive通过.value修改值 ref也可以像vue2中的ref那样使用 toRef 针对一个响应式对象&#xff08;reactive&#xff09;的prop创建一个ref两者保持引用关系 toRefs 将响应式对象&#xff08;reactive封装&#xff09;转换…

论文阅读:Speculative RAG: Enhancing Retrieval Augmented Generation through Drafting

论文地址&#xff1a;https://arxiv.org/abs/2407.08223 RAG 将 LLM 的生成能力与外部知识源相结合&#xff0c;以提供更准确和最新的响应。最近的 RAG 进展侧重于通过迭代 LLM 完善或通过 LLM 的额外指令调整获得自我批判能力来改进检索结果。在这项工作中&#xff0c;作者介…

编程中的智慧六:单例、原型、建造者

上一篇咱们结合Spring介绍了设计模式中的工厂模式相关方法&#xff0c;其实现在Java开发基本上都是基于Spring框架开发&#xff0c;所以后续我们在开发过程中基本上很少自己重写一个工厂模式&#xff0c;都是直接使用Spring来完成。今天咱们接着看剩下的创建型设计模式&#xf…

Dubbo学习笔记

Dubbo 简介 Apache Dubbo是一款高性能的Java RPC框架。其前身是阿里巴巴公司开源的一个高性能、轻量级的开源Java RPC框架&#xff0c;可以和Spring框架无缝集成。 其中文官网:https://dubbo.gitbooks.io/dubbo-user-book/content/ 特性和用法 架构 节点角色说明 节点角色…

应用层的重点协议

目录 一、DNS 二、NAT 1、技术背景 2、NAT机制IP转化过程 三、NAPT NAT技术的缺陷 四、HTTP 1、协议格式 2、HTTP请求 1&#xff09;method(方法) GET请求的特点 POST请求的特点 GET和POST的区别 2&#xff09;URL(网址) 基本格式 关于URL encode 3&#xff0…

c++11:异常

目录 c异常与c传统处理错误的区别 c语言处理错误的方式 c处理错误的方式 异常的抛出和处理 demo 异常的重新抛出 demo 异常安全 noexcept 自定义异常体系 c舍弃了c语言处理错误的方式&#xff0c;引入了异常来处理错误。 c异常与c传统处理错误的区别 c语言处理错…

js什么情况下使用同步,什么时候异步加载

JavaScript 中的同步和异步操作主要取决于代码的执行过程。以下是一些常见的同步和异步使用场景: 同步操作: 基本操作: 赋值、算术运算、逻辑判断等基本语句,这些操作都是同步执行的。 DOM 操作: 获取、修改 DOM 元素的属性和内容,这些操作都是同步执行的。 阻塞操作: 一些耗…

el-table表头使用el-dropdown出现两个下拉框

问题描述&#xff1a;el-table在固定右边列时&#xff0c;表头使用el-dropdown会出现两个下拉框&#xff0c;如图所示&#xff1a; 解决方法&#xff1a; 1.只显示第一个下拉框&#xff0c;通过控制样式将其他的下拉框display:none; 2.如图所示&#xff0c;修改插槽写法&…

<数据集>学生课堂行为识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;13899张 标注数量(xml文件个数)&#xff1a;13899 标注数量(txt文件个数)&#xff1a;13899 标注类别数&#xff1a;8 标注类别名称&#xff1a;[js, tt, dk, zt, dx, zl, jz, xt] # 举手 js # 抬头听课 …

从FasterTransformer源码解读开始了解大模型(2.3)代码通读04

从FasterTransformer源码解读开始了解大模型&#xff08;2.3&#xff09;代码解读04-forward函数 写在前面的话 本篇的内容继续解读forward函数&#xff0c;从972行开始进行解读 零、embedding函数 让我们考虑一种不包含prefix_soft_prompt的情况&#xff0c;从999行的embe…

在 PostgreSQL 里如何实现数据的冷热数据分层存储的自动化策略调整?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 在 PostgreSQL 里如何实现数据的冷热数据分层存储的自动化策略调整 在 PostgreSQL 里如何实现数据的冷…

【数据分享】2013-2022年我国省市县三级的逐日SO2数据(excel\shp格式\免费获取)

空气质量数据是在我们日常研究中经常使用的数据&#xff01;之前我们给大家分享了2000——2022年的省市县三级的逐日PM2.5数据和2013-2022年的省市县三级的逐日CO数据&#xff08;均可查看之前的文章获悉详情&#xff09;&#xff01; 本次我们分享的是我国2013——2022年的省…

mongodb数据导出与导入

一、先去检查mongodump mongodump --version 如果报 mongodump version: built-without-version-string 或者其他的较老的版本&#xff0c;直接去下载最新的【传送门】 【以Ubuntu18.04为例】 安装工具 假设你下载的是 .tgz 文件&#xff08;适用于 Linux 系统&#xff09;&am…

【项目】星辰博客介绍

目录 一、项目背景 二、项目功能 1. 登录功能&#xff1a; 2. 列表页面&#xff1a; 3. 详情页面&#xff1a; 4. 写博客&#xff1a; 三、技术实现 四、功能页面展示 1. 用户登录 2. 博客列表页 3. 博客编辑更新页 4.博客发表页 5. 博客详情页 五.系统亮点 1.强…

高性能图数据库Neo4j从入门到实战

图数据库Neo4j介绍 什么是图数据库&#xff08;graph database&#xff09; 随着社交、电商、金融、零售、物联网等行业的快速发展&#xff0c;现实社会织起了了一张庞大而复杂的关系网&#xff0c;传统数据库很难处理关系运算。大数据行业需要处理的数据之间的关系随数据量呈…