C#中Monitor对象与Lock关键字的区别分析
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()
{
//做具体的事情
}
}
相关文章
- 实现线程同步的第一种方式是我们经常使用的lock关键字,它将包围的语句块标记为临界区,这样一次只有一个线程进入临界区并执行代码,接下来通过本文给大家介绍C#中实现线程同步lock关键字的用法详解,一起看看吧...2020-06-25
- 这篇文章主要介绍了C#中的lock、Monitor、Mutex学习笔记,本文讲解的都是线程同步的一些知识,需要的朋友可以参考下...2020-06-25
- 本篇文章是对使用C# lock同时访问共享数据进行了详细的分析介绍,需要的朋友参考下...2020-06-25
- 这篇文章主要介绍了C$ 笔试题之同线程Lock语句递归不会死锁,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
- ShedLock是一个在分布式环境中使用的定时任务框架,这篇文章主要介绍了SpringBoot配置ShedLock分布式定时任务,需要的朋友们下面随着小编来一起学习学习吧...2021-05-24
- 这篇文章主要给大家介绍了如何通过一篇文章带你轻松了解C# Lock关键字的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-11-03
- 本篇文章是对C#多线程中lock关键字的使用进行了详细的分析介绍,需要的朋友参考下...2020-06-25
- 这篇文章主要介绍了C#中Monitor对象与Lock关键字的区别,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了c语言clock函数使用示例,需要的朋友可以参考下...2020-04-25
- 这篇文章主要介绍了C#中lock死锁的用法,对于共享资源的访问及C#程序设计的安全性而言,有着非常重要的意义!需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了iOS block循环引用详解和应用,常见误区详解,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下...2021-08-22
- 本篇文章主要是对c#多线程中Lock()关键字的用法进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助...2020-06-25
- 这是公司服务器管理的小软件(我偏好自己写),重启IIS,重启服务器,监控服务器,如果你没有电脑上网而手机能上网时,就可以通过手机了解服务器的状态...2016-01-27
- 这篇文章主要介绍了C#中lock用法,以实例形式详细分析了lock语句的用法及用途,需要的朋友可以参考下...2020-06-25
- flock在php中的作用是操作文件时锁定文件,只取取消锁定时才可用。 flock ( PHP 4中, PHP 5中) flock-便携式咨询文件锁定 描述 布尔群(资源$处理,诠释$操...2016-11-25
- 这篇文章主要为大家详细介绍了WPF图形解锁控件ScreenUnLock的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-22
- 这篇文章主要介绍了解MySQL监控工具 mysql-monitor的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧...2020-07-20
- 这篇文章主要介绍了C#读取或设置ScrollLock状态的方法,涉及C#操作ScrollLock滚动状态的技巧,非常具有实用价值,需要的朋友可以参考下...2020-06-25
block(块元素)、inline(内联元素)的差别是什么?
我们首先要了解,所有的html元素,都要么是block(块元素)、要么是inline(内联元素)。下面了解一下block、inline各自的特点: block元素的特点: 总...2017-07-06Spring Cloud分布式定时器之ShedLock的实现
这篇文章主要介绍了Spring Cloud分布式定时器之ShedLock的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-09