C# Monitor锁

embedded/2024/10/18 7:48:29/

一、Lock和Monitor的关系

二、Monitor多于Lock的功能

三、Monitor常用属性和方法


一、Lock和Monitor的关系

Lock在IL代码中会被翻译成Monitor。lock(obj){}  等同于 Monitor.Enter(obj)和Monitor.Exit(obj)

lock 是语法糖,是通过 Monitor 来实现的。

lock能做的Monitor肯定能做,Monitor能做的lock不一定能做

二、Monitor多于Lock的功能

1、Monitor.TryEnter(obj,timespan)----timeout之后,就不执行这段代码了。lock会一直死等。

2、还有Monitor.Wait()和Monitor.Pulse()。在lock代码里面如果调用了Monitor.Wait(),会放弃对资源的所有权,让别的线程lock进来。然后别的线程代码里Pulse一下(让原线程进入到等待队列),然后在Wait一下释放资源,这样原线程的就可以继续执行了(代码还堵塞在wait那句话呢)。

也就是说,必须两个或多个线程共同调用Wait和Pulse,把资源的所有权抛来抛去,才不会死锁。

和AutoEvent相似是处理同步关系的,但是AutoEvent是跨进程的,而Monitor是针对线程的。

三、Monitor常用属性和方法

              Enter(Object) 在指定对象上获取排他锁。

    Exit(Object) 释放指定对象上的排他锁。

    IsEntered 确定当前线程是否保留指定对象锁。

    Pulse 通知等待队列中的线程锁定对象状态的更改。

    PulseAll 通知所有的等待线程对象状态的更改。

    TryEnter(Object) 试图获取指定对象的排他锁。

    TryEnter(Object, Boolean) 尝试获取指定对象上的排他锁,并自动设置一个值,指示是否得到了该锁。

    Wait(Object) 释放对象上的锁并阻止当前线程,直到它重新获取该锁。

常用的方法有两个,Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,在使用过程中为了避免获取锁之后因为异常,致锁无法释放,所以需要在try{} catch(){}之后的finally{}结构体中释放锁(Monitor.Exit())。

TryEnter(Object)TryEnter() 方法在尝试获取一个对象上的显式锁方面和 Enter() 方法类似。然而,它不像Enter()方法那样会阻塞执行。如果线程成功进入关键区域那么TryEnter()方法会返回true. 和试图获取指定对象的排他锁 

我们可以通过Monitor.TryEnter(monster, 1000),该方法也能够避免死锁的发生,Monitor.TryEnter(Object,Int32)。 设置1S的超时时间,如果在1S之内没有获得同步锁,则返回false,也就是说,在1秒中后,lockObj还未被解锁,TryEntry方法就会返回false,如果在1秒之内,lockObj被解锁,TryEntry返回true。我们可以使用这种方法来避免死锁

注:Wait 和 Pulse 方法必须写在 Monitor.Enter 和Moniter.Exit 之间

 

 

 


http://www.ppmy.cn/embedded/6944.html

相关文章

手写一个民用Tomcat (04)

我们继续来 写 Tomcat 这次我们做优化,先看一下一个标准的http 协议 GET /servlet/com.yixin.HelloWorldServlet HTTP/1.1 Host: localhost:8080 Connection: keep-alive sec-ch-ua: "Microsoft Edge";v"123", "Not:A-Brand";v&quo…

Linux基本命令之正则表达式(转义字符)

一:查看二进制文件 strings 命令:strings 文件名 生成链接文件 ln 命令:ln 选项 源文件(f1) 链接文件(f2) 软连接:eg:ln -s f1 f2 软链接不能跨分区链接,但可以在同一分区的不同目录下链接…

OWASP发布大语言模型网络安全与治理清单

当前人工智能技术面临的最大风险是大语言模型(LLM)和生成式人工智能技术的发展和应用速度已经远远超过了安全和治理的速度。 OpenAI、Anthropic、谷歌和微软等公司的生成式人工智能和大语言模型产品的使用正呈指数级增长。与此同时,开源大语…

CCleaner怎么清理软件缓存 CCleaner清理要勾选哪些 ccleanerfree下载

CCleaner软件是一款优秀的数据清理软件,其中没有硬盘和内存的设置,也不含任何广告软件,其出色的注册表清洁功能能够保证您的电脑更稳定运行。本文将围绕CCleaner怎么清理软件缓存,CCleaner清理要勾选哪些的相关内容进行介绍。 一、…

【第十二届“泰迪杯”数据挖掘挑战赛】【2024泰迪杯】B题基于多模态特征融合的图像文本检索—更新(正式比赛)

【第十二届“泰迪杯”数据挖掘挑战赛】【2024泰迪杯】B题基于多模态特征融合的图像文本检索—更新(正式比赛) 往期链接: 【第十二届“泰迪杯”数据挖掘挑战赛】【2024泰迪杯】B题基于多模态特征融合的图像文本检索—解题全流程(…

LeetCode hot100-29-Y

19. 删除链表的倒数第 N 个结点给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。这题比较简单,我的想法和官方一是一样的,剩下的不想看了。 就是要注意一下删除的是第一个节点的情况,单独处理一下。 我…

Avalonia 捕获全局异常(UI线程 和 非UI线程),增加客户端的稳定性

在 App.axaml.cs 中,App类添加下列事件; 1.重写 OnFrameworkInitializationCompleted ,会在程序初始化完成后触发 2. 绑定AppDomain中当前域的事件 AppDomain.CurrentDomain.UnhandledException HandleGlobalException; //UI线程 …

文心一言vsGPT-4全面对比

文心一言和GPT-4都是当前非常先进的人工智能语言模型,它们各自具有独特的特点和优势。以下是对这两款工具的全面比较: 文心一言是由百度开发的一款大型人工智能语言模型,它基于强大的深度学习技术和海量的数据资源,具备出色的语言…