当前位置: 首页 > news >正文

C# 中的 `lock` 关键字本质

C# 中的 lock 关键字本质上是基于 Monitor 类实现的线程同步机制,其核心是通过 互斥锁(Mutex) 确保代码块的原子性执行。以下是其实现本质的分步解析:


1. 语法糖的转换

当使用 lock 关键字时:

lock (obj)
{// 临界区代码
}

编译器会将其转换为以下代码结构:

object __lockObj = obj;
bool __lockTaken = false;
try
{Monitor.Enter(__lockObj, ref __lockTaken);// 临界区代码
}
finally
{if (__lockTaken)Monitor.Exit(__lockObj);
}
  • Monitor.Enter:尝试获取对象的锁(若锁已被占用,当前线程会阻塞)。
  • Monitor.Exit:释放锁,确保锁在异常情况下也能正确释放。

2. 底层同步机制

Monitor 的底层实现依赖操作系统的同步原语:

  • Windows:使用 Critical Section(用户态轻量级锁,避免内核态切换的开销)。
  • Linux/macOS:通过 pthread_mutex_t(POSIX 线程互斥锁)实现。
  • 自旋(Spinning)优化:在进入内核态阻塞线程前,Monitor 会短暂自旋(循环尝试获取锁),减少上下文切换的开销。

3. 锁对象的要求

  • 必须是引用类型:值类型会被装箱,导致每次锁定的对象不同,失去同步作用。
  • 建议使用私有对象:避免外部代码意外锁定同一对象,引发死锁。
    private readonly object _syncLock = new object(); // 正确做法
    

4. 线程状态管理

  • 锁竞争:当线程调用 Monitor.Enter 时:
    • 如果锁空闲,线程获取锁并继续执行。
    • 如果锁被占用,线程进入 等待队列(Wait Queue),状态变为 Blocked
  • 锁释放:调用 Monitor.Exit 时:
    • 唤醒等待队列中的下一个线程(若有)。
    • 若使用 Monitor.Pulse/PulseAll,可显式控制线程唤醒(常用于生产者-消费者模式)。

5. 可重入性(Reentrancy)

  • 同一线程可重复获取锁:C# 的 Monitor 允许线程多次进入同一个锁(重入),计数器记录锁定次数,需对应次数的 Exit 调用才能完全释放。
    lock (obj)
    {// 可再次锁定同一对象lock (obj){// 代码...}
    }
    

6. 性能与注意事项

  • 避免锁粒度过大:锁定的代码块应尽量小,减少线程阻塞时间。
  • 避免嵌套锁:可能引发死锁(需确保锁的获取顺序一致)。
  • 替代方案:在特定场景下,可使用 SemaphoreMutexReaderWriterLockSlim 等更灵活的同步机制。

总结

C# 的 lock 本质是通过 Monitor 类实现的互斥锁,结合用户态和内核态的同步机制,确保多线程环境下的代码原子性执行。其设计在易用性和性能之间取得平衡,但需开发者合理使用以避免死锁和性能问题。

相关文章:

C# 中的 `lock` 关键字本质

C# 中的 lock 关键字本质上是基于 Monitor 类实现的线程同步机制,其核心是通过 互斥锁(Mutex) 确保代码块的原子性执行。以下是其实现本质的分步解析: 1. 语法糖的转换 当使用 lock 关键字时: lock (obj) {// 临界区…...

Java 集合:泛型、Set 集合及其实现类详解

参考资料:java入门到飞起 Java;泛型;Set 集合;TreeSet;HashSet;数据结构 一、引言 在 Java 编程中,集合框架是一个重要的组成部分,它提供了丰富的数据结构和算法来存储和操作数据。泛型与 Set…...

前端基础之《Vue(8)—内置组件》

一、Vue2.0中的内置组件 1、<slot> 插槽 2、<keep-alive> 动态组件 被keep-alive所包裹的组件&#xff1a; &#xff08;1&#xff09;不会被销毁。 &#xff08;2&#xff09;还会多两个生命周期钩子&#xff1a;activated()、deactivated()。 &#xff08;3&a…...

Zookeeper是什么?基于zookeeper实现分布式锁

zookeeper听的很多&#xff0c;但实际在应用开发中用的不错&#xff0c;主要是作为中间件配合使用的&#xff0c;例如&#xff1a;Kafka。 了解zk首先需要知道它的数据结构&#xff0c;可以想象为树、文件夹目录。每个节点有基本的信息&#xff0c;例如&#xff1a;创建时间、…...

计算机网络 第二章:应用层(四)

2.6 视频流和内容分发网 对如何在因特网中实现流行的视频流服务进行概述。它们的实现方式是使用应用层协议和以像高速缓存那样方式运行的服务器。 2.6.1 因特网视频 在流式存储视频应用中&#xff0c;基础的媒体是预先录制的视频&#xff0c;例如电影、电视节目、录制好的体育…...

什么是数据库的DDL和DML,有什么区别?

数据库中的 DDL 和 DML 是两类不同的 SQL 语言&#xff0c;用于不同的数据库操作目的。以下是它们的定义、区别和具体说明&#xff1a; 1. DDL&#xff08;Data Definition Language&#xff0c;数据定义语言&#xff09; 作用&#xff1a;定义或修改数据库的结构&#xff08;…...

HCIP实验二(OSPF网络配置与优化)

一.拓扑图与题目 1.R5为ISP&#xff0c;其上只能配置IP地址; R5与其他所有直连设备间均使用公有IP;环回地址为100.1.1.1/3 2.R4设备为企业出口路由器 3.整个0SPF环境IP基于172.16.0.0/16划分 4.所有设备均可访问R5的环回; 5.减少LSA的更新里&#xff0c;加快收敛&#xff0…...

第十六讲、isaaclab中使用任务空间(task-space)控制

0 前言 官方教程&#xff1a;https://isaac-sim.github.io/IsaacLab/main/source/tutorials/05_controllers/run_diff_ik.html IsaacsimIsaaclab安装&#xff1a;https://blog.csdn.net/m0_47719040/article/details/146389391?spm1001.2014.3001.5502 在之前的教程中我们利…...

无人船 | 图解基于PID控制的路径跟踪算法(以欠驱动无人艇Otter为例)

目录 1 PID控制的三大组成1.1 比例控制作用1.2 积分控制作用1.3 微分控制作用 2 基于欠驱动运动学的PID控制3 跟踪效果分析 1 PID控制的三大组成 PID控制律的定量表达请参考无人船 | 图解基于PID控制的路径跟踪算法(以全驱动无人艇WAMV为例)&#xff0c;本文进一步介绍PID每个…...

【C++】13.list的模拟实现

首先&#xff0c;我们需要把链表管理起来&#xff0c;也就是把一个个节点管理起来&#xff0c;但是每个节点的信息我们也需要管理&#xff0c;例如节点的前驱指针和后驱指针&#xff0c;以及节点的值&#xff0c;所以我们这里先封装两个类来管理节点和链表。 namespace Ro {te…...

Springfox + Swagger 的完整配置及同类框架对比的详细说明

以下是 Springfox Swagger 的完整配置及同类框架对比的详细说明&#xff1a; 一、Springfox Swagger 配置详解 1. 添加依赖 在 pom.xml 中添加以下依赖&#xff1a; <!-- Springfox Swagger 2 --> <dependency><groupId>io.springfox</groupId>…...

实现支付宝沙箱环境搭建

1.介绍 在业务开发的过程中&#xff0c;有时会涉及到一些支付相关的功能&#xff0c;这个时候就需要接入第三方支付接口&#xff0c;而由于开发中需要不断进行测试&#xff0c;使用真实的账号进行支付就有些不值得&#xff0c;所以支付宝为我们提供了第三方SDK&#xff0c;供我…...

element-ui transfer 组件源码分享

transfer 穿梭框组件源码简单分享&#xff0c;主要从以下几个方面&#xff1a; 1、transfer 组件页面结构。 2、transfer 组件属性。 3、transfer 组件方法。 4、transfer 组件事件。 5、transfer slot 挂载。 一、组件页面结构。 二、组件属性。 2.1 value / v-model 绑…...

【最新版】沃德代驾源码全开源+前端uniapp

一.系统介绍 基于ThinkPHPUniapp开发的代驾软件。系统源码全开源&#xff0c;代驾软件的主要功能包括预约代驾、在线抢单、一键定位、在线支付、车主登记和代驾司机实名登记等‌。用户可以通过小程序预约代驾服务&#xff0c;系统会估算代驾价格并推送附近代驾司机供用户选择&…...

【无标题】spark安装部署

Spark 4种部署模式的另外2种&#xff0c;分别是Yarn、windows模式。 二、 实验准备工作&#xff1a; 1. 三台linux虚拟机 2. spark的压缩包 三、 实验步骤 Spark-yarn 1. 解压缩文件&#xff0c;并重命名为spark-yarn。 tar zxvf spark-3.0.0-bin-hadoop3.2.tgz mv spar…...

【异常解决】Spring Boot 返回排序后的 Map 但前端接收顺序不对的解决方案

博主介绍&#xff1a;✌全网粉丝22W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

中兴云电脑W102D_晶晨S905X2_2+16G_mt7661无线_安卓9.0_线刷固件包

中兴云电脑W102D_晶晨S905X2_216G_mt7661无线_安卓9.0_线刷固件包 准备工作&#xff1a; 工具和设备在开始刷机之前&#xff0c;确保你已经准备好以下物品&#xff1a;双公头USB线&#xff1a;选择一根30-50厘米长的USB线&#xff0c;长度适中&#xff0c;方便操作&#xff0c;…...

深度学习激活函数与损失函数全解析:从Sigmoid到交叉熵的数学原理与实践应用

目录 前言一、sigmoid 及导数求导二、tanh 三、ReLU 四、Leaky Relu五、 Prelu六、Softmax七、ELU八、极大似然估计与交叉熵损失函数8.1 极大似然估计与交叉熵损失函数算法理论8.1.1 伯努利分布8.1.2 二项分布8.1.3 极大似然估计总结 前言 书接上文 PaddlePaddle线性回归详解…...

Kotlin中实现静态

实现“类似静态” class Util {fun action1() {}//使用companion object关键字会在类的内部创建一个伴生类&#xff0c;每个类都允许有一个伴生类//而action2作为伴生类中的方法&#xff0c;可以直接通过类名进行调用&#xff0c;实现类似“静态”的效果companion object {fun…...

Android 回显

//执行 private void playRunTime(String cmd) throws Exception { Process p Runtime.getRuntime().exec(cmd); InputStream is p.getInputStream(); BufferedReader reader new BufferedReader(new InputStreamReader(is)); String l…...

基于大模型的胃食管反流病全周期预测与诊疗方案研究

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 二、胃食管反流病概述 2.1 疾病定义与分类 2.2 流行病学特征 2.3 发病机制 三、大模型技术原理与应用基础 3.1 大模型简介 3.2 适用于胃食管反流病预测的大模型类型 3.3 数据收集与预处理 四、大模型在胃食…...

class文件(二)

字段表集合&#xff1a; 用于描述接口或类中声明的变量 包括类级变量以及实例级变量&#xff0c;不包括方法内部声明的局部变量 字段的修饰符包括&#xff1a; 作用域&#xff1a;public、private、protected修饰符 实例还是类变量&#xff1a;static 可变性&#xff1a;fin…...

Django 实现电影推荐系统:从搭建到功能完善(附源码)

前言&#xff1a;本文将详细介绍如何使用 Django 构建一个电影推荐系统&#xff0c;涵盖项目的搭建、数据库设计、视图函数编写、模板渲染以及用户认证等多个方面。&#x1f517;软件安装、环境准备 ❤ 【作者主页—&#x1f4da;阅读更多优质文章、获取更多优质源码】 目录 一…...

UML2.0中的14种图简介,并借助AI生成UML图

UML2.0中的14种图简介&#xff0c;并借助AI生成UML图 绘制流程结构图&#xff08;Structure Diagrams&#xff09;1. 类图&#xff08;Class Diagram&#xff09;&#xff1a;2. 对象图&#xff08;Object Diagram&#xff09;&#xff1a;3. 组件图&#xff08;Component Diag…...

Jsoup、Selenium 和 Playwright 的含义、作用和区别

文章目录 一、Jsoup1. 含义2. 作用3. 核心特性4. 适用场景 二、Selenium1. 含义2. 作用3. 核心特性4. 适用场景 三、Playwright1. 含义2. 作用3. 核心特性4. 适用场景 四、Jsoup、Selenium 和 Playwright 的区别五、适用场景对比六、总结 Jsoup、Selenium 和 Playwright 都是用…...

服务器如何修复SSL证书错误?

修复服务器上的SSL证书错误需要根据具体错误类型逐步排查和解决。以下是常见的步骤和解决方案&#xff1a; --- ### **1. 确认错误类型** 首先检查浏览器或工具&#xff08;如OpenSSL&#xff09;报错的具体信息&#xff0c;常见错误包括&#xff1a; - **证书过期**&#xf…...

AD9253链路训练

传统方式 参考Xilinx官方文档xapp524。对于AD9253器件 - 125M采样率 - DDR模式&#xff0c;ADC器件的DCO采样时钟(500M Hz)和FCO帧时钟是中心对齐的&#xff0c;适合直接采样。但是DCO时钟不能直接被FPGA内部逻辑使用&#xff0c;需要经过BUFIO和BUFR缓冲后&#xff0c;得到s_b…...

VAE-LSTM异常检测模型复刻报告

VAE-LSTM异常检测模型复刻报告 复刻背景 本报告记录了我复刻VAE-LSTM异常检测模型的完整过程。原论文提出了一种结合变分自编码器(VAE)和长短期记忆网络(LSTM)的异常检测方法&#xff0c;用于时间序列数据。 环境配置 复刻过程中使用的环境配置如下&#xff1a; Python 3.…...

有哪些信誉良好的脂多糖供应商推荐?

一般描述 Sigma-Aldrich的脂多糖 (LPS) 是糖脂&#xff0c;由连接单个或多个脂肪酸的碳水化合物单元组合而成&#xff0c;存在于革兰氏阴性菌细胞壁中。LPS是外膜的重要组成部分&#xff0c;结构由脂质A、葡萄糖胺基磷脂、短核寡糖和O-抗原&#xff08;远端多糖&#xff09;组…...

初识分布式事务原理

事务是指符合ACID特性的操作就是事务&#xff0c;在同一个数据库中&#xff0c;如果要分别对表A和表B进行插入和删除操作&#xff0c;如果其中一个操作执行失败&#xff0c;可以对当前数据库进行回滚&#xff0c;使其回滚到执行操作前的状态&#xff0c;但是现有的系统架构都是…...

文件上传过程中出现EOFException的解决方案

文件上传过程中出现EOFException的解决方案 项目场景&#xff1a; 项目是一个考试测评系统&#xff0c;包含学生答题截图上传功能。学生通过前端界面提交答题截图&#xff0c;后端服务接收并处理这些图片文件&#xff0c;存储到MinIO对象存储中。 问题描述 前端调用’提交答…...

智能文档解析系统架构师角色定义

&#xff08;根据专业写作类任务要求&#xff0c;以系统架构师角色定义范式进行结构化呈现&#xff09; 智能文档解析系统架构师角色定义 核心技能模块 1. 多模态语义解析引擎 支持中英双语对齐的异构数据解码遵循ISO/IEC 30140标准的JSON语法校验体系 ├─ 智能字段补全机…...

翻倍缠论系统+拐点多空雷达,组合指标的使用操盘技术

如上图&#xff0c;单独从副图指标信号来说&#xff0c;在标记①的位置&#xff0c;开始出现副图指标【拐点多空雷达】转多的买点&#xff0c;红柱开始出现就是跟进做多的第一买点。 在标记②的位置&#xff0c;副图指标出现红柱持续&#xff0c;而黑色的柱线开始出现&#xf…...

Linux脏页相关参数

参数 以下是Linux内核中与脏页&#xff08;Dirty Page&#xff09;相关的各个参数及其含义的详细说明&#xff1a; 1. vm.dirty_background_bytes 含义&#xff1a;系统内存中脏页数量的绝对字节阈值&#xff08;单位为字节&#xff09;&#xff0c;当脏页达到此值时&#x…...

C++20 module下的LVGL模拟器

ARM GCC&#xff1a;14.2 Toolchain&#xff1a;MSVC 前篇&#xff1a;使用SDL2搭建简易LVGL模拟器_lvgl sdl-CSDN博客 故事 从前 我所用的单片机工程本身是为了电赛设计的&#xff0c;由于电赛的特性&#xff0c;需要使用同一个实验平台通过不同外设的“排列组合”来实现不…...

Go全栈_Golang、Gin实战、Gorm实战、Go_Socket、Redis、Elasticsearch、微服务、K8s、RabbitMQ全家桶

Go全栈全家桶包含&#xff1a; 1、【零基础入门】Go语言核心编程零基础入门实战&#xff0c;B站学习地址分享&#xff1a; 【2025年新版】Go语言教程 2、GolangGinGorm仿小米商城企业级项目实战 3、Golang仿小米商城高并发微服务实战 4、Golang RabbitMQ高并发秒杀、抢购、预约…...

STM32提高篇: 蓝牙通讯

STM32提高篇: 蓝牙通讯 一.蓝牙通讯介绍1.蓝牙技术类型 二.蓝牙协议栈1.蓝牙芯片架构2.BLE低功耗蓝牙协议栈框架 三.ESP32-C3中的蓝牙功能1.广播2.扫描3.通讯 四.发送和接收 一.蓝牙通讯介绍 蓝牙&#xff0c;是一种利用低功率无线电&#xff0c;支持设备短距离通信的无线电技…...

Linux系统编程---精灵进程与守护进程

1、前言 精灵进程又称守护进程、后台进程&#xff0c;在英文中称为 daemon 进程。精灵进程是运行在一个相对干净的环境、不受终端影响、常驻内存的进程&#xff0c;和神话中的精灵一样&#xff0c;拥有不死不灭的特性&#xff0c;长期稳定提供某种功能或服务。 在Linux系统中&a…...

《让机器人读懂你的心:情感分析技术融合奥秘》

机器人早已不再局限于执行简单机械的任务&#xff0c;人们期望它们能像人类伙伴一样&#xff0c;理解我们的喜怒哀乐&#xff0c;实现更自然、温暖的互动。情感分析技术&#xff0c;正是赋予机器人这种“理解人类情绪”能力的关键钥匙&#xff0c;它的融入将彻底革新机器人与人…...

科技项目必须进行验收测试吗?项目验收测试服务机构有哪些?

在现代科技迅猛发展的背景下&#xff0c;各类科技项目层出不穷&#xff0c;从智能硬件到软件系统&#xff0c;乃至工业自动化解决方案&#xff0c;项目的质量直接关系到企业的信誉、用户体验和市场竞争力。那么科技项目必须进行验收测试吗? 简短且明确的回答是&#xff1a;必…...

7.7 Axios+Redux+JWT全链路实战:打通前后端API通信最佳实践

Axios+Redux+JWT全链路实战:打通前后端API通信最佳实践 连接前端与后端 API:全链路数据交互设计指南 关键词:前后端通信架构设计、RESTful API 开发、Axios 请求拦截、Redux 状态管理、JWT 认证集成 1. 前后端通信架构设计原则 我们采用分层架构实现前后端解耦,通过 RES…...

零基础入门 Verilog VHDL:在线仿真与 FPGA 实战全流程指南

摘要 本文面向零基础读者,全面详解 Verilog 与 VHDL 两大主流硬件描述语言(HDL)的核心概念、典型用法及开发流程。文章在浅显易懂的语言下,配合多组可在线验证的示例代码、PlantUML 电路结构图,让你在 EDA Playground 上动手体验数字电路设计与仿真,并深入了解从 HDL 编写…...

[蓝桥杯 2025 省 Python B] 最多次数

import sysdef max_times() -> int:s sys.stdin.readline().strip()checked {l,q,b} # set()&#xff0c;不存在键值对&#xff0c;识别为set&#xff08;&#xff09;n len(s)time 0i 0while i < n - 2:sec s[i:i3]if set(sec) checked:i 3time 1else:i 1sys.…...

HTTP相关

目录 一、HTTP状态码 1XX信息性状态码 2XX成功状态码 3XX重定向状态码 4XX客户端错误状态码 5XX服务器错误状态码 二、GET/POST/PUT/DELETE请求 2.1GET 2.2POST 2.3PUT 2.4DELETE 2.5RESTful API例子 三、RESTful API 3.1什么是RESTful API 3.2RESTful API中的关…...

使用rclone迁移minio文件

文章目录 一、rclone简介1、工具说明2、核心特点2.1、跨平台支持2.2、多存储支持2.3、加密与安全2.4、增量同步与断点续传2.5、高性能 3、适用场景3.1、云存储迁移3.2、备份与同步3.3、跨云协作3.4、数据加密归档 二、常用命令1、基础操作2、文件传输3、文件管理4、高级功能5、…...

基于Java与MAVLink协议的多无人机(Cube飞控)集群控制与调度方案问题

基于Java与MAVLink协议的多无人机&#xff08;Cube飞控&#xff09;集群控制与调度方案问题 背景需求&#xff1a; 我们目前有一个基于Cube飞控的无人机系统&#xff0c;需实现以下核心功能&#xff1a; 多机通信&#xff1a;通过MAVLink协议同时连接并控制多架无人机&#x…...

Super-Vlan和MUX-Vlan的原理、配置、区别

Super-Vlan 原理 Super-Vlan也叫Aggregate-Vlan。 一般的三层交换机中&#xff0c;通常是采用一个VLAN对应一个vlanif接口的方式实现广播域之间的互通&#xff0c;这在某些情况下导致了IP地址的浪费。因为一个VLAN对应的子网中&#xff0c;子网号、子网定向广播地址、子网缺…...

数据一致性问题剖析与实践(二)——单机事务的一致性问题

一、前言 我们一般讲到单机事务&#xff0c;离不开的就是数据库&#xff0c;其最重要的定义就是&#xff0c;要么全部成功执行&#xff0c;要么全部不执行&#xff0c;保证安全的状态转化。 之前我们讨论了几种场景的一致性问题 冗余数据存储中的一致性问题分布式共识中的一…...

VUE Element-ui Message 消息提示组件自定义封装

为了让message 信息提示的更加方便快捷&#xff0c;减少不同地方的调用&#xff0c;避免代码的重复&#xff0c;特意再官方message 组件的基础上二次封装&#xff0c;使代码更加的优雅和高效。 实现效果&#xff1a; 代码组件&#xff1a; 封装成 message.js 文件&#xff0c;…...

HSTL详解

一、HSTL的基本定义 HSTL&#xff08;High-Speed Transceiver Logic&#xff09; 是一种针对高速数字电路设计的差分信号接口标准&#xff0c;主要用于高带宽、低功耗场景&#xff08;如FPGA、ASIC、高速存储器接口&#xff09;。其核心特性包括&#xff1a; 差分信号传输&…...