转:C#中Monitor对象与Lock关键字的区别分析

news/2024/7/5 11:43:08

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

2.Monitor的常用属性和方法:

    Enter(Object) 在指定对象上获取排他锁。
    Exit(Object) 释放指定对象上的排他锁。
    IsEntered 确定当前线程是否保留指定对象锁。
    Pulse 通知等待队列中的线程锁定对象状态的更改。
    PulseAll 通知所有的等待线程对象状态的更改。
    TryEnter(Object) 试图获取指定对象的排他锁。
    TryEnter(Object, Boolean) 尝试获取指定对象上的排他锁,并自动设置一个值,指示是否得到了该锁。
    Wait(Object) 释放对象上的锁并阻止当前线程,直到它重新获取该锁。

Lock关键字

1.Lock关键字实际上是一个语法糖,它将Monitor对象进行封装,给object加上一个互斥锁,A进程进入此代码段时,会给object 对象加上互斥锁,此时其他B进程进入此代码段时检查object对象是否有锁?如果有锁则继续等待A进程运行完该代码段并且解锁object对象之后,B 进程才能够获取object对象为其加上锁,访问代码段。

2.Lock关键字封装的Monitor对象结构如下:

       try{Monitor.Enter(obj);dosomething();}catch(Exception ex){}finally{Monitor.Exit(obj);}

3.锁定的对象应该声明为private static object obj = new object();尽量别用公共变量和字符串、this、值类型。

Monitor和Lock的区别

1.Lock是Monitor的语法糖。
2.Lock只能针对引用类型加锁。
3.Monitor能够对值类型进行加锁,实质上是Monitor.Enter(object)时对值类型装箱。
4.Monitor还有其他的一些功能。

本文代码示例:

 class Program{private static object obj = new object();public void LockSomething(){lock (obj){dosomething();}}public void MonitorSomeThing(){try{Monitor.Enter(obj);dosomething();}catch(Exception ex){}finally{Monitor.Exit(obj);}}public void dosomething(){ //做具体的事情
        }}

 原文:http://www.cnblogs.com/cuihongyu3503319/p/5730268.html


http://lihuaxi.xjx100.cn/news/242945.html

相关文章

接口测试要如何做数据准备

数据准备是接口测试过程中不可或缺的一步,也是花费时间很长的工作,因为程序的功能就是处理数据。那么在接口测试中,我们要怎样来准备数据呢?小编整理了以下一些关于数据准备的方法,希望对大家能有所帮助。 数据准备分为两种类型&…

舆情,文本挖掘

MLE,MAP,EM 和 point estimation 之间的关系是怎样的 和点估计相对应的是区间估计,这个一般入门的统计教材里都会讲。直观说,点估计一般就是要找概率密度曲线上值最大的那个点,区间估计则要寻找该曲线上满足某种条件的…

leetcode--删除排序链表中的重复元素--python

文章目录题目题目详情示例解题代码思路代码运行结果最佳方案题目 题目详情 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。 示例 输入: 1->1->2 输出: 1->2输入: 1->1->2->3->3 输出: 1->2->3解题代码 …

学好web前端开发要注意哪些问题

web前端学起来是比较困难的,当然想要学好web前端技术,那么有一些注意事项一定是要看的,下面小编就为大家详细的介绍一下学好web前端开发要注意哪些问题? ​  学好web前端开发要注意哪些问题? 基础:无论做什么都一定要有扎实的…

thinkphp-条件判断-范围判断-range标签

说明range标签,替换判断用法,其中type属性的值可以用in/notin/between/notbetween, 其它属性的用法和IN或者BETWEEN一致示例{range name"2" value"1,2,3",type"in"}在 {/range}输出在转载于:https://blog.51cto.com/suyan…

leetcode--买股票的最佳时机II--python

文章目录题目题目详情注意示例代码思路解题代码运行结果最佳方案题目 题目详情 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。…

全球首届APMCon,带你给“应用性能”把把脉

前段时间,美国苹果公司应用程序购买商店和手机等一系列应用因技术故障中断服务,持续了约两个半小时。故障发生后,世界多地苹果用户纷纷吐槽无法购买和更新手机应用、无法备份等。其实,这不是苹果公司在线服务第一次掉线&#xff0…

Java培训收费标准是什么样的

java技术在互联网行业的快速发展,可谓是前景非常可观的,越来越多的人想要了解java技术系统学习的培训和收费标准,尤其是想知道Java培训收费标准是什么样的?来看看下面的详细介绍。 ​  Java培训收费标准是什么样的?要说培训学费我们首先要…