C#中Monitor对象与Lock关键字的区别分析
时间:2022-01-13 02:50:27
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()
{
//做具体的事情
}
}
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
C#使用第三方组件实现动态解析和求值字符串表达式
![](https://img.aspxhome.com/file/2023/0/104370_0s.jpg)
Java中比较抽象类与接口的异同
java类加载相关知识总结
![](https://img.aspxhome.com/file/2023/4/70514_0s.png)
SpringBoot嵌入式Servlet容器与定制化组件超详细讲解
![](https://img.aspxhome.com/file/2023/5/75795_0s.png)
SpringBoot使用JWT实现登录验证的方法示例
![](https://img.aspxhome.com/file/2023/9/63689_0s.png)
Java毕业设计实战项目之仓库管理系统的实现流程
![](https://img.aspxhome.com/file/2023/3/74993_0s.jpg)
Java 8新特性方法引用详细介绍
.NET企业级项目中遇到的国际化问题和解决方法
Spring使用xml方式整合第三方框架流程详解
java模拟hibernate一级缓存示例分享
java中mybatis和hibernate的用法总结
jar包手动添加到本地maven仓库的步骤详解
![](https://img.aspxhome.com/file/2023/5/59785_0s.png)
Java编程用指定字符打印菱形实例
IDEA中的maven没有dependencies解决方案
![](https://img.aspxhome.com/file/2023/1/66641_0s.png)
详解Asp.Net MVC的Bundle捆绑
![](https://img.aspxhome.com/file/2023/2/96322_0s.png)
一文带你了解Java选择排序的原理与实现
![](https://img.aspxhome.com/file/2023/4/64784_0s.jpg)
Spring Security OAuth2实现使用JWT的示例代码
Java如何修改.class文件变量
![](https://img.aspxhome.com/file/2023/9/80169_0s.png)
将项目上传到Maven中央仓库(2023最新版)
![](https://img.aspxhome.com/file/2023/0/103970_0s.png)