首页 > 编程语言 >c#线程安全

c#线程安全

时间:2023-04-27 23:33:29浏览次数:41  
标签:语句 __ c# lock 安全 对象 实例 线程

引用:https://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/statements/lock

lock 语句获取给定对象的互斥 lock,执行语句块,然后释放 lock。 持有 lock 时,持有 lock 的线程可以再次获取并释放 lock。 阻止任何其他线程获取 lock 并等待释放 lock。 lock 语句可确保单个线程具有对该对象的独占访问权限。

lock 语句具有以下格式
lock (x)
{
// Your code...
}
其中 x 是引用类型的表达式。 它完全等同于

object __lockObj = x;
bool __lockWasTaken = false;
try
{
System.Threading.Monitor.Enter(__lockObj, ref __lockWasTaken);
// Your code...
}
finally
{
if (__lockWasTaken) System.Threading.Monitor.Exit(__lockObj);
}
由于该代码使用 try...finally 块,即使在 lock 语句的正文中引发异常,也会释放 lock。
在 lock 语句的正文中不能使用 await 运算符。

当同步对共享资源的线程访问时,请锁定专用对象实例(例如,private readonly object balanceLock = new object();)或另一个不太可能被代码无关部分用作 lock 对象的实例。 避免对不同的共享资源使用相同的 lock 对象实例,因为这可能导致死锁或锁争用.
具体而言,请避免将以下类型用作 lock 对象:

this(调用方可能将其用作 lock)。
Type 实例(因为这些对象可以通过 typeof 运算符或反射获取)。
字符串实例,包括字符串文本,(因为字符串字面量可能是暂存的)。
尽可能缩短持有锁的时间,以减少锁争用。

标签:语句,__,c#,lock,安全,对象,实例,线程
From: https://www.cnblogs.com/zzzyt/p/17360537.html

相关文章

  • SQLServer2005 AMD8450,3核CPU装不上sql 2005的解决办法
    中午12点开始,安装SQLServer2005,一直到晚上9点半,把网上的各个文章翻了个遍,依然没有安装上我的SQLServer2005,安装不上的症状跟网上其它人遇到的一样,可是为什么别人的就解决了,我的就不行呢```带着郁闷的心情睡觉了```夜里3点几分,起夜,想到数据库还......
  • js javascript js隐藏页面上有id的控件,隐藏页面上无控件包含的文字,控制页面控件属性
    1.隐藏页面上有id的控件varinput=document.getElementsByTagName("input");//获取页面所有inputfor(vari=0;i<input.length;i++){if(input.item(i).id.indexOf("txt")>=0)//判断input的id中是否包含txt字符串{......
  • iOS MachineLearning 系列(9)—— 人物蒙版图生成
    iOSMachineLearning系列(9)——人物蒙版图生成人物蒙版图能力是Vision框架在iOS15中新增的功能,这个功能可以将图片中的人物按照轮廓生成无光蒙版。无光蒙版在实际业务中非常有用,使用此蒙版可以方便的将人物从图片中提取出来,然后和其他的背景图进行合成。1-人物蒙版的提取首......
  • #yyds干货盘点#Class 对象
    类对象支持两种操作:属性引用和实例化。属性引用 使用Python中所有属性引用所使用的标准语法: obj.name。有效的属性名称是类对象被创建时存在于类命名空间中的所有名称。因此,如果类定义是这样的:classMyClass:"""Asimpleexampleclass"""i=12345deff(s......
  • C语言--练习
    1、写一个函数输出a的二进制(补码)中1的个数。intcount_(inta){ intcount=0; for(inti=0;i<32;i++) { if(((a>>i)&1)==1) count++; } returncount;}intmain(){ intcount=0; inta=0; scanf("%d",&a); count=count_(a);......
  • 记录一次git patch解析的问题
    因为工作需要对gitpatch内容进行解析,解析成文件及对应修改行、删除行的数据结构。gitpatch大概内容:点击查看代码commitmessage1commitmessage2diff--gita/file1.txtb/file1.txtindex1234567..abcdefg100644---a/file1.txt+++b/file1.txt@@-1,3+1,5@@l......
  • Tablespace 'innodb_system' Page [page id: space=0, page number=5] log sequence n
    场景:这几天在外面实习,老师的项目数据库崩了让我看,连着两条看到十一二点,哎。主要场景是mysql突然崩溃,发现重启mysqld服务无效,重启系统无效。查看/var/log/mysql.log日志,看到以下内容:Themanualpageathttp://dev.mysql.com/doc/mysql/en/crashing.htmlcontainsinfo......
  • 【Visual Leak Detector】核心源码剖析(VLD 1.0)
    说明使用VLD内存泄漏检测工具辅助开发时整理的学习笔记。本篇对VLD1.0源码做内存泄漏检测的思路进行剖析。同系列文章目录可见《内存泄漏检测工具》目录目录说明1.源码获取2.源码文件概览3.源码剖析3.1注册自定义AllocHook函数3.2存储调用堆栈信息3.3生成泄漏检测......
  • vector
    vector使用 1.头文件#include<vector>2.初始化如果vector的元素类型是int,默认初始化为0;如果vector元素类型为string,则默认初始化为空字符串。vector<int>v1;vector<father>v2;vector<string>v3;vector<vector<int>>;//注意空格。这里相当于二维数组inta[n][n];vecto......
  • 线程暂停
    代码:namespaceThreadPause{publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}ManualResetEventOnOff=newManualResetEvent(true);privatevoidForm1_Load(objectsende......