当前位置: 首页 > news >正文

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()
        { 
            //做具体的事情
        }
    }

 

 
 
 

相关文章:

  • HDU 1575 Tr A (矩阵乘法)
  • MVC使用基架添加控制器出现的错误:无法检索XXX的元数据
  • 从程序员的视角揭秘Silverlight
  • oracle索引再论
  • Android应用开发学习笔记之多线程与Handler消息处理机制
  • jquery $.each() 小探
  • HDU 4089 Activation
  • Linux 上安装 Subversion
  • PHP5.4第二天——数组、多维数组和数组函数
  • MySQL数据库中delimiter的作用概述
  • unigui验证微信服务器的有效性
  • python PIL except: IOError: decoder jpeg not available
  • Pyp 替代sed,awk的文本处理工具
  • 看电影读小说,你就能懂经济学
  • android 开发环境安装和测试中常出现的问题
  • [Vue CLI 3] 配置解析之 css.extract
  • 《剑指offer》分解让复杂问题更简单
  • 【Linux系统编程】快速查找errno错误码信息
  • 2019.2.20 c++ 知识梳理
  • Angular4 模板式表单用法以及验证
  • Centos6.8 使用rpm安装mysql5.7
  • ES10 特性的完整指南
  • happypack两次报错的问题
  • iOS 系统授权开发
  • JavaScript中的对象个人分享
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • Mac转Windows的拯救指南
  • React-redux的原理以及使用
  • session共享问题解决方案
  • Solarized Scheme
  • SpiderData 2019年2月25日 DApp数据排行榜
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • Web Storage相关
  • webgl (原生)基础入门指南【一】
  • 安卓应用性能调试和优化经验分享
  • 技术胖1-4季视频复习— (看视频笔记)
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 实现菜单下拉伸展折叠效果demo
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • Java性能优化之JVM GC(垃圾回收机制)
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​2020 年大前端技术趋势解读
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • #HarmonyOS:Web组件的使用
  • #includecmath
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • $.each()与$(selector).each()
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (13):Silverlight 2 数据与通信之WebRequest
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (剑指Offer)面试题34:丑数
  • (论文阅读11/100)Fast R-CNN
  • (十)c52学习之旅-定时器实验
  • (淘宝无限适配)手机端rem布局详解(转载非原创)