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

 更新时间:2013年06月24日 17:09:56   作者:  
这篇文章主要介绍了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()
        {
            //做具体的事情
        }
    }
   

相关文章

  • C#控制台程序中使用官方依赖注入的实现

    C#控制台程序中使用官方依赖注入的实现

    这篇文章主要介绍了C#控制台程序中使用官方依赖注入的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • 在C#里面给PPT文档添加注释的实现代码

    在C#里面给PPT文档添加注释的实现代码

    平常开会或者做总结报告的时候我们通常都会用到PowerPoint演示文稿,我们可以在单个幻灯片或者全部幻灯片里面添加注释,这样观众可以从注释内容里面获取更多的相关信息,需要的朋友可以参考下
    2017-01-01
  • 基于WPF实现验证码控件

    基于WPF实现验证码控件

    这篇文章主要介绍了如何利用WPF实现一个简单的验证码控件,文中的示例代码讲解详细,对我们学习或工作有一定帮助,需要的可以参考一下
    2022-08-08
  • C#将制定目录文件名转换成大写的方法

    C#将制定目录文件名转换成大写的方法

    这篇文章主要介绍了C#将制定目录文件名转换成大写的方法,涉及C#操作文件及字符串的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • C#调用dll报错:无法加载dll,找不到指定模块的解决

    C#调用dll报错:无法加载dll,找不到指定模块的解决

    这篇文章主要介绍了C#调用dll报错:无法加载dll,找不到指定模块的解决问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • 基于C# 生成Zip压缩包代码

    基于C# 生成Zip压缩包代码

    压缩包制作也是很多项目中需要用到的功能。接下来通过本文给大家介绍基于C# 生成Zip压缩包代码,对c生成zip压缩包相关知识感兴趣的朋友一起学习吧
    2016-04-04
  • C#判断字符串中是否包含指定字符串及contains与indexof方法效率问题

    C#判断字符串中是否包含指定字符串及contains与indexof方法效率问题

    这篇文章主要介绍了C#判断字符串中是否包含指定字符串及contains与indexof方法效率问题 ,文中给大家列举通过两种方法来判断,需要的朋友可以参考下
    2018-10-10
  • C#获取文件夹所占空间大小的功能

    C#获取文件夹所占空间大小的功能

    这篇文章介绍了C#获取文件夹所占空间大小的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • C#处理XML文件的示例详解

    C#处理XML文件的示例详解

    XML是一种标记语言,是从标准通用标记语言(SGML)中简化修改出来的,本文主要介绍了C#处理XML文件的相关知识,有需要的小伙伴可以了解一下
    2024-11-11
  • 一文详解C#中重写(override)及覆盖(new)的区别

    一文详解C#中重写(override)及覆盖(new)的区别

    这篇文章主要为大家详细介绍了C#中重写(override)及覆盖(new)这两个关键词的区别,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2023-03-03

最新评论