博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Monitor和Lock以及区别
阅读量:4462 次
发布时间:2019-06-08

本文共 1844 字,大约阅读时间需要 6 分钟。

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

转载于:https://www.cnblogs.com/DiscoverPalace/p/3153834.html

你可能感兴趣的文章
HDU 4866 Shooting 扫描线 + 主席树
查看>>
证券从业资格考试考试心得
查看>>
Linux下Web性能压力测试工具http_load使用教程
查看>>
JVM(一),谈谈你对java的理解
查看>>
搜索的应用-分配货物
查看>>
004.ES2015和ES2016新特性--块级作用域变量
查看>>
Vue入门之HelloWorld
查看>>
网络连接跃点数问题
查看>>
用户职责请求组查询
查看>>
怎样让心情保持平静?
查看>>
error LNK1281: 无法生成 SAFESEH 映像 LNK2026 模块对于 SAFESEH 映像是不安全的 VS2015 /win10...
查看>>
字符类型转换
查看>>
C# 多线程
查看>>
最大子数组求解两个
查看>>
Python-列表、元组、字典
查看>>
Select 使用不当引发的core,你应该知道的
查看>>
冷知识 —— 计算机科学及编程
查看>>
新技能 get —— 使用 python 生成词云
查看>>
西雅图之行
查看>>
ASP.NET MVC异步上传文件
查看>>