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

标签:Monitor,Lock
0
投稿

猜你喜欢

  • 详解Android Studio无法检测新版本问题解决

    2021-08-01 08:45:05
  • Java中Steam流的用法详解

    2021-12-16 14:18:50
  • Android实现带指示点的自动轮播无限循环效果

    2021-12-09 19:22:44
  • java实现用户自动登录

    2023-11-10 14:38:59
  • Java多线程的具体介绍与使用笔记小结

    2023-01-17 05:23:13
  • java实现飞机游戏代码

    2022-01-08 06:48:34
  • 详解Springboot对多线程的支持

    2023-09-21 02:18:21
  • 详解如何实现SpringBoot的底层注解

    2023-11-23 06:21:04
  • Android中Bitmap用法实例分析

    2023-03-21 11:06:31
  • Hibernate多对一单项关联

    2023-05-10 18:16:11
  • Spring MVC接口防数据篡改和重复提交

    2023-11-29 15:02:11
  • 基于json解析神器 jsonpath的使用说明

    2022-06-14 08:57:18
  • Java overload和override的区别分析

    2023-10-12 15:16:17
  • java并发编程之ThreadLocal详解

    2023-03-15 11:44:33
  • 详解Unity安卓共享纹理

    2022-07-10 08:18:21
  • c#如何使用 XML 文档功能

    2023-12-25 03:44:33
  • 从Cocos2d-x2迁移到Cocos2d-x3的过程分享

    2021-06-07 23:52:28
  • C#给picturebox控件加图片选中状态的2个方法

    2022-06-03 01:37:03
  • Spring Security使用中Preflight请求和跨域问题详解

    2021-06-12 11:04:15
  • 深入c# Func委托的详解

    2022-02-15 05:44:51
  • asp之家 软件编程 m.aspxhome.com