【C#】Lock关键字

一、概述

Lock关键字,确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。

Lock关键字属于语法糖,其本质是Threading.Monitor来控制的。

二、原理

对于任何一个对象来说,它在内存中的第一部分放置的是所有方法的地址,第二部分放着一个索引,这个索引指向CLR中的SyncBlock Cache区域中的一个SyncBlock。

当你执行Monitor.Enter(Object)时,如果object的索引值为负数,就从SyncBlock Cache中选取一个SyncBlock,将其地址放在object的索引中。这样就完成了以object为标志的锁定,其他的线程想再次进行Monitor.Enter(object)操作,将获得object的已经为正值的索引,然后就等待。直到索引变为负数,即调用Monitor.Exit(object)将索引变为负数,等待的线程开始执行。

三、特征

  • 不能锁定空值
  • 不能锁定string类型,整个程序中任何给定字符串都只有一个实例,具有相同内容的字符串都代表着同一个实例。因此,只要在应用程序进程中的任何位置处具有相同内容的字符串上放置了锁,就将锁定应用程序中与该字符串具有相同内容的字符串。因此,最好锁定不会被暂留的私有或受保护成员
  • 锁定的对象是一个程序块的内存边界
  • 值类型不能被Lock
  • 避免锁定public 类型或不受程序控制的对象;如果该实例可以被公开访问,不受控制的代码也可能会锁定该对象。这可能导致死锁,即两个或更多个线程等待释放同一对象。出于同样的原因,锁定公共数据类型(相比于对象)也可能导致问题
  • Unity直接使用Lock机制阻止用户直接在子线程中使用Unity的一些特定属性

四、加锁方式

  • 使用对象本身作为锁对象,对写线程进行加锁
    • 在写线程中,对象将会被锁定,执行完毕之后释放锁,此时对象已经被更改(因为写入操作引起的更改)
  • 使用对象本身作为锁对象,对读线程进行加锁
    • 在读线程中,对象将会被锁定,所以读的过程中对象都将保持不变
  • 使用System.Object作为锁对象
    • 使用其他的引用类型,比如System.Object,此时线程不会访问该类型的任何属性和方法,适用于锁代码块

五、同步块(SyncBlock)

SyncBlock,也称为 Monitor,是在 .NET 平台下用于支持多线程同步的一种机制。它用于实现 C# 中的 lock 关键字和 Monitor 类的功能。

每一个托管对象的头部之前都存在一个Object Header,存储着各种各样的信息,其中就包含SyncBlock的信息。

在多线程编程中,当多个线程同时访问共享资源时,可能会引发竞争条件和数据不一致的问题。SyncBlock 是一种轻量级的同步对象,用于确保对共享资源的互斥访问,从而避免竞争条件和数据不一致性。

当一个线程要进入一个由 Lock 关键字或 Monitor 类保护的代码块时,它会尝试获取 SyncBlock 的所有权。如果 SyncBlock 已被其他线程持有,则当前线程会被阻塞,直到 SyncBlock 可用为止。一旦线程执行完由 lock 关键字或 Monitor 类保护的代码块,它将释放 SyncBlock 的所有权,以便其他线程可以继续访问这个代码块。

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

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

相关文章

数据结构【栈和队列】

第三章 栈与队列 一、栈 1.定义:只允许一端进行插入和删除的线性表,结构与手枪的弹夹差不多,可以作为实现递归函数(调用和返回都是后进先出)调用的一种数据结构; 栈顶:允许插入删除的那端&…

网络知识点之-BGP协议

边界网关协议(BGP)是运行于 TCP 上的一种自治系统的路由协议。 BGP 是唯一一个用来处理像因特网大小的网络的协议,也是唯一能够妥善处理好不相关路由域间的多路连接的协议。 BGP 构建在 EGP 的经验之上。 BGP 系统的主要功能是和其他的 BGP 系…

How to Use your mac to Read a Word and Repeat it more times

Using the say Command on a Mac 在 Mac 上使用 say 命令 The say command is a fun and useful feature on Mac computers that allows you to convert text to speech using the command line. With this command, you can make your Mac speak anything you type after it…

特征选择策略:为检测乳腺癌生物标志物寻找新出口

内容一览:microRNA(小分子核糖核酸)是一类短小的单链非编码 RNA 转录体。这些分子在多种恶性肿瘤中呈现失控性生长,因此近年来被诸多研究确定为确诊癌症的可靠的生物标志物 (biomarker)。在多种病理分析中,差异表达分析…

vue3下的uniapp跨域踩坑

uniapp vue3 H5跨域踩坑 开发移动端H5的时候由于后端接口没有做跨域处理,因此需要做下服务器代理,于是百度搜索了uniapp下h5的跨域配置 在manifest下的h5配置proxy,大概是这样: "h5": {"devServer": {"https"…

安全—01day

文章目录 1. 编码1.1 ASCLL编码1.2 URL编码1.3 Unicode编码1.4 HTML编码1.5 Base64编码 2. form表单2.1 php接收form表单2.2 python接收form表单 1. 编码 1.1 ASCLL编码 ASCII 是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的…

对话天壤创始人薛贵荣:AIGC正在成为新的“水煤电”

AIGC正在悄无声息地成为各行各业的必需品。 数科星球原创 作者丨苑晶 编辑丨大兔 国内的大模型混战半年有余,传统互联网巨头和人工智能公司纷纷入场。在“百模大战”的关键时刻,行业悄然发生分化。一些更具前瞻性的企业开始眺望远方,准备打…

ajax/axios访问后端测试方法

文章目录 1、浏览器执行javascript方法GET请求POST请求 2、Postman测试工具GET请求POST请求 3、idea IDE提供的httpclient4、Apache JMeter 1、浏览器执行javascript方法 GET请求 http://localhost:6060/admin/get/123 POST请求 技巧:打开谷歌浏览器&#xff0c…

zookeeper学习(二) 集群模式安装

前置环境 三台centos7服务器 192.168.2.201 192.168.2.202 192.168.2.150三台服务器都需要安装jdk1.8以上zookeeper安装包 安装jdk 在单机模式已经描述过,这里略过,有需要可以去看单机模式中的这部分,注意的是三台服务器都需要安装 安装…

C数据结构与算法——队列 应用(C语言纯享版 迷宫)

实验任务 (1) 掌握顺序循环队列及其C语言的表示; (2) 掌握入队、出队等基本算法的实现; (3) 掌握顺序循环队列的基本应用(求解迷宫通路)。 实验内容 使用C语言实现顺序循环队列的类型定义与算法函数;编写main()函数…

算法与数据结构(三)--栈

一.栈的基本概念 栈是一种特殊的表,这种表只在表首进行插入和删除操作。 因此,表首对于栈来说具有特殊的意义,称为栈顶。相应的,表尾称为栈底。不含任何元素的栈称为空栈。 栈的修改遵循后进先出的原则,Last In First…

Java前后端交互long类型溢出的解决方案

问题描述: 前端根据id发起请求查找对象的时候一直返回找不到对象,然后查看了请求报文,发现前端传给后台的数据id不对,原本的id是1435421253099634623,可前端传过来的id是 1435421253099634700,后三位变成了…

Zabbix邮件报警(163网易邮箱)

目录 一、电脑登录网易邮箱配置 二、Server端安装配置邮件服务器 邮箱查看 三、编辑zabbix_server.conf 引用邮件脚本 查看邮件 五、配置zabbix web监控项邮件报警 操作思路 Server.zabbix.com web操作 确认报警媒介信息 配置zabbix中的用户所使用的报警媒介类型以及接收邮…

【网络】HTTPS协议

目录 一、概念 1、HTTPS 2、加密解密 3、加密的必要性 4、常见的加密方式 4.1、对称加密 4.2、非对称加密 5、数据摘要 && 数据指纹 6、数字签名 二、HTTPS的工作过程 1、只使用对称加密 2、只使用非对称加密 3、双方都使用非对称加密 4、非对称加密 对…

rust gtk 桌面应用 demo

《精通Rust》里介绍了 GTK框架的开发,这篇博客记录并扩展一下。rust 可以用于桌面应用开发,我还挺惊讶的,大学的时候也有学习过 VC,对桌面编程一直都很感兴趣,而且一直有一种妄念,总觉得自己能开发一款很好…

深入学习 Redis - 深挖经典数据类型之 set

目录 前言 一、Set 类型 1.1、操作命令 sadd / smembers(添加) sismember(判断存在) scard(获取元素个数) spop(删除元素) smove(移动) srem&#x…

CSAP_ORD_BOM_MAINTAIN 销售订单BOM

[TOC] 1 BAPI:CSAP_ORD_BOM_MAINTAIN 2 Detail 2.1 Deleted line STPO_API03-FLDELETE ‘X’ 2 .2 Modified Line 2.21 Please specify below lines . STPO_API03-ITEM_NODE STPO-STLKN. STPO_API03-ITEM_COUNT STOP-STPOZ. 2.22 Example. CONSTANTS : C…

若依-前台无法正常启动,npm run dev失败

问题场景: 使用若依Vue前端分离版-基于SpringBoot的权限管理系统进行实战。 问题描述与解决 拉取若依项目后,根据官方开发文档(项目readme文档)进行依赖下载安装后,启动失败。 出现以下几个问题: 运行n…

VisDrone2019上训练YOLOv5(用ultralytics)

使用的package library: ultralytics 环境:python3.8, torch1.7.0 把ultralytics代码git clone 到本地 git clone https://github.com/ultralytics/ultralytics/ 本地新建一个train.py,内容写下面这些。 from ultralytics import YOLO# Load a model…

Golang time 包以及日期函数

time 包 在 golang 中 time 包提供了时间的显示和测量用的函数。 time.Now()获取当前时间 可以通过 time.Now()函数获取当前的时间对象,然后获取时间对象的年月日时分秒等信息。 示例代码如下: package mainimport ("fmt""time" )…